Смещение члена класса
От: PavelCH  
Дата: 03.10.09 11:09
Оценка:
Добрый день, всем!

Допустм есть определение:

class A
{
    int x;
    int y;
};

class B
{
    char x;
    char y;
};

struct Metadata
{
    int Offset;
    int Size;
};

Metadata Test;


Можно ли каким-то образом присвоить Test.Offset смещение члена, например, y из класса A, или, y из класса B? Под смещением я понимаю смещение члена класса в байтах от начала объекта в памяти.

Я пытался делать (int)&B::y ругается, что не может преобразовать выражение к числу int. Но ведь &B::y это е и есть смещение?
Нехай щастить
Re: Смещение члена класса
От: Сергей Мухин Россия  
Дата: 03.10.09 11:16
Оценка: +1
Здравствуйте, PavelCH, Вы писали:

PCH>Можно ли каким-то образом присвоить Test.Offset смещение члена, например, y из класса A, или, y из класса B? Под смещением я понимаю смещение члена класса в байтах от начала объекта в памяти.


PCH>Я пытался делать (int)&B::y ругается, что не может преобразовать выражение к числу int. Но ведь &B::y это е и есть смещение?



#ifndef FIELDOFFSET
#define FIELDOFFSET(type, field)    ((short)&(((type *)0)->field))
#endif
---
С уважением,
Сергей Мухин
Re: Смещение члена класса
От: hexamino http://hexamino.blogspot.com/
Дата: 03.10.09 11:43
Оценка:
Здравствуйте, PavelCH, Вы писали:

PCH>Я пытался делать (int)&B::y ругается, что не может преобразовать выражение к числу int. Но ведь &B::y это е и есть смещение?


Нет.
Re[2]: Смещение члена класса
От: PavelCH  
Дата: 03.10.09 12:19
Оценка:
СМ>
СМ>#ifndef FIELDOFFSET
СМ>#define FIELDOFFSET(type, field)    ((short)&(((type *)0)->field))
СМ>#endif
СМ>


Спасибо, то что надо
Нехай щастить
Re: Смещение члена класса
От: Николай Ивченков  
Дата: 03.10.09 14:52
Оценка: +2 :)
PavelCH:

PCH>Можно ли каким-то образом присвоить Test.Offset смещение члена


Для нахождения смещения члена есть стандартный макрос offsetof (для использования в C надо подключать stddef.h, в C++ — cstddef). А то, что предложил Мухин, — это хак.
Re[2]: Смещение члена класса
От: Сергей Мухин Россия  
Дата: 03.10.09 15:03
Оценка:
Здравствуйте, Николай Ивченков, Вы писали:

PCH>>Можно ли каким-то образом присвоить Test.Offset смещение члена


НИ>Для нахождения смещения члена есть стандартный макрос offsetof (для использования в C надо подключать stddef.h, в C++ — cstddef). А то, что предложил Мухин, — это хак.


конечно

вот по стандарту:

/* Define offsetof macro */
#ifdef __cplusplus

#ifdef  _WIN64
#define offsetof(s,m)   (size_t)( (ptrdiff_t)&reinterpret_cast<const volatile char&>((((s *)0)->m)) )
#else
#define offsetof(s,m)   (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
#endif

#else

#ifdef  _WIN64
#define offsetof(s,m)   (size_t)( (ptrdiff_t)&(((s *)0)->m) )
#else
#define offsetof(s,m)   (size_t)&(((s *)0)->m)
#endif

#endif    /* __cplusplus */
---
С уважением,
Сергей Мухин
Re[3]: Смещение члена класса
От: Николай Ивченков  
Дата: 03.10.09 16:52
Оценка:
Сергей Мухин:

СМ>вот по стандарту


В реализации стандартной библиотеки могут использоваться любые особенности компилятора, задокументированные для внутреннего использования и не задокументированные для обычного пользователя. К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному, так если что-то работает в потрохах библиотеки, то ещё не факт, что оно будет так же работать и в пользовательском коде.
Re[4]: Смещение члена класса
От: Сергей Мухин Россия  
Дата: 03.10.09 17:15
Оценка:
Здравствуйте, Николай Ивченков, Вы писали:

СМ>>вот по стандарту


НИ>В реализации стандартной библиотеки могут использоваться любые особенности компилятора, задокументированные для внутреннего использования и не задокументированные для обычного пользователя. К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному, так если что-то работает в потрохах библиотеки, то ещё не факт, что оно будет так же работать и в пользовательском коде.


К чему это? Проблема решена давно, Вы же дали стандартное решение.
---
С уважением,
Сергей Мухин
Re[2]: Смещение члена класса
От: igna Россия  
Дата: 04.10.09 05:27
Оценка:
Здравствуйте, Николай Ивченков, Вы писали:

НИ>Для нахождения смещения члена есть стандартный макрос offsetof (для использования в C надо подключать stddef.h, в C++ — cstddef).


Только не надо забывать, что применять этот макрос можно только к POD:

18.1 Types [lib.support.types]

. . .

5 The macro offsetof accepts a restricted set of type arguments in this International Standard. type
shall be a POD structure or a POD union (clause 9).


Хотя возможно это ограничение будет снято в будущем.
Re[3]: Смещение члена класса
От: Николай Ивченков  
Дата: 04.10.09 09:40
Оценка:
igna:

НИ>>Для нахождения смещения члена есть стандартный макрос offsetof (для использования в C надо подключать stddef.h, в C++ — cstddef).


I>Только не надо забывать, что применять этот макрос можно только к POD:

I>Хотя возможно это ограничение будет снято в будущем.

В C++0x этот макрос можно будет применять ко всем standard-layout классам:

N2914 — 18.2/4:

The macro offsetof(type, member-designator) accepts a restricted set of type arguments in this International Standard. If type is not a standard-layout class (Clause 9), the results are undefined.

N2914 — 9/7:

A standard-layout class is a class that:

— has no non-static data members of type non-standard-layout class (or array of such types) or reference,
— has no virtual functions (10.3) and no virtual base classes (10.1),
— has the same access control (Clause 11) for all non-static data members,
— has no non-standard-layout base classes,
— either has no non-static data members in the most-derived class and at most one base class with non-static data members, or has no base classes with non-static data members, and
— has no base classes of the same type as the first non-static data member.

Re[4]: Смещение члена класса
От: Николай Ивченков  
Дата: 04.10.09 10:07
Оценка:
НИ>В C++0x этот макрос можно будет применять ко всем standard-layout классам

* Ну, разумеется, за исключением тех, где нет доступных нестатических data member-ов, один из которых можно было бы указать вторым параметром
Re[4]: Смещение члена класса
От: Vain Россия google.ru
Дата: 05.10.09 01:00
Оценка:
Здравствуйте, Николай Ивченков, Вы писали:

НИ>К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному

Осталось только научить компиляторы различать библиотечный код от пользовательского.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: Смещение члена класса
От: Erop Россия  
Дата: 05.10.09 04:12
Оценка:
Здравствуйте, Vain, Вы писали:

НИ>>К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному

V>Осталось только научить компиляторы различать библиотечный код от пользовательского.

А что тут учить? Компиллер по #include<string> может ничего не включать, а просто подгружать результаты компиляции хедера из какого-то архива...
А в хедере string при этом может быть написано что угодно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Смещение члена класса
От: Vain Россия google.ru
Дата: 05.10.09 09:04
Оценка:
Здравствуйте, Erop, Вы писали:

НИ>>>К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному

V>>Осталось только научить компиляторы различать библиотечный код от пользовательского.
E>А что тут учить? Компиллер по #include<string> может ничего не включать, а просто подгружать результаты компиляции хедера из какого-то архива...
E>А в хедере string при этом может быть написано что угодно
А если я свой инклуд также назову?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[7]: Смещение члена класса
От: Erop Россия  
Дата: 05.10.09 09:37
Оценка:
Здравствуйте, Vain, Вы писали:

V>А если я свой инклуд также назову?

Это запрещено делать. Соответственно у производителей компилятора руки развязаны...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Смещение члена класса
От: Vain Россия google.ru
Дата: 05.10.09 10:00
Оценка:
Здравствуйте, Erop, Вы писали:

V>>А если я свой инклуд также назову?

E>Это запрещено делать. Соответственно у производителей компилятора руки развязаны...
Всмысле? У себя инклуд так и назову..
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[9]: Смещение члена класса
От: Erop Россия  
Дата: 05.10.09 11:02
Оценка:
Здравствуйте, Vain, Вы писали:

V>Всмысле? У себя инклуд так и назову..

Ну и не получится скомпилировать.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: Смещение члена класса
От: Vain Россия google.ru
Дата: 05.10.09 11:13
Оценка:
Здравствуйте, Erop, Вы писали:

V>>Всмысле? У себя инклуд так и назову..

E>Ну и не получится скомпилировать.
Ну и нафик такой компилятор?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[11]: А язык такой зачем? ;)
От: Erop Россия  
Дата: 05.10.09 11:35
Оценка:
Здравствуйте, Vain, Вы писали:

V>Ну и нафик такой компилятор?

Зато по стандарту
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: А язык такой зачем? ;)
От: Vain Россия google.ru
Дата: 05.10.09 12:39
Оценка:
Здравствуйте, Erop, Вы писали:

V>>Ну и нафик такой компилятор?

E>Зато по стандарту
Получается как в анекдоте.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.