PavelCH:
PCH>Можно ли каким-то образом присвоить Test.Offset смещение члена
Для нахождения смещения члена есть стандартный макрос offsetof (для использования в C надо подключать stddef.h, в C++ — cstddef). А то, что предложил Мухин, — это хак.
Здравствуйте, PavelCH, Вы писали:
PCH>Можно ли каким-то образом присвоить Test.Offset смещение члена, например, y из класса A, или, y из класса B? Под смещением я понимаю смещение члена класса в байтах от начала объекта в памяти.
PCH>Я пытался делать (int)&B::y ругается, что не может преобразовать выражение к числу int. Но ведь &B::y это е и есть смещение?
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 это е и есть смещение?
Здравствуйте, PavelCH, Вы писали:
PCH>Я пытался делать (int)&B::y ругается, что не может преобразовать выражение к числу int. Но ведь &B::y это е и есть смещение?
Здравствуйте, Николай Ивченков, Вы писали:
PCH>>Можно ли каким-то образом присвоить Test.Offset смещение члена
НИ>Для нахождения смещения члена есть стандартный макрос offsetof (для использования в C надо подключать stddef.h, в C++ — cstddef). А то, что предложил Мухин, — это хак.
В реализации стандартной библиотеки могут использоваться любые особенности компилятора, задокументированные для внутреннего использования и не задокументированные для обычного пользователя. К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному, так если что-то работает в потрохах библиотеки, то ещё не факт, что оно будет так же работать и в пользовательском коде.
Здравствуйте, Николай Ивченков, Вы писали:
СМ>>вот по стандарту
НИ>В реализации стандартной библиотеки могут использоваться любые особенности компилятора, задокументированные для внутреннего использования и не задокументированные для обычного пользователя. К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному, так если что-то работает в потрохах библиотеки, то ещё не факт, что оно будет так же работать и в пользовательском коде.
К чему это? Проблема решена давно, Вы же дали стандартное решение.
Здравствуйте, Николай Ивченков, Вы писали:
НИ>Для нахождения смещения члена есть стандартный макрос 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).
Хотя возможно это ограничение будет снято в будущем.
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.
Здравствуйте, Николай Ивченков, Вы писали:
НИ>К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному
Осталось только научить компиляторы различать библиотечный код от пользовательского.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
НИ>>К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному V>Осталось только научить компиляторы различать библиотечный код от пользовательского.
А что тут учить? Компиллер по #include<string> может ничего не включать, а просто подгружать результаты компиляции хедера из какого-то архива...
А в хедере string при этом может быть написано что угодно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
НИ>>>К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному V>>Осталось только научить компиляторы различать библиотечный код от пользовательского. E>А что тут учить? Компиллер по #include<string> может ничего не включать, а просто подгружать результаты компиляции хедера из какого-то архива... E>А в хедере string при этом может быть написано что угодно
А если я свой инклуд также назову?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>А если я свой инклуд также назову?
Это запрещено делать. Соответственно у производителей компилятора руки развязаны...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
V>>А если я свой инклуд также назову? E>Это запрещено делать. Соответственно у производителей компилятора руки развязаны...
Всмысле? У себя инклуд так и назову..
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Всмысле? У себя инклуд так и назову..
Ну и не получится скомпилировать.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Vain, Вы писали:
V>Ну и нафик такой компилятор?
Зато по стандарту
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Николай Ивченков, Вы писали:
НИ>Для нахождения смещения члена есть стандартный макрос offsetof (для использования в C надо подключать stddef.h, в C++ — cstddef). А то, что предложил Мухин, — это хак.
Здравствуйте, Erop, Вы писали:
V>>Всмысле? У себя инклуд так и назову.. E>Ну и не получится скомпилировать.
Ну и получит производитель пачку багов от кастомеров.
Затем путем нехитрых но неприятных действий менеджмент производителя компилера донесёт до автора подобных "оптимизаций" простую и очевидную мысль: "нехрен выделываться".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Николай Ивченков, Вы писали:
НИ>>Для нахождения смещения члена есть стандартный макрос offsetof (для использования в C надо подключать stddef.h, в C++ — cstddef). А то, что предложил Мухин, — это хак.
CC>#define offsetof(s,m) (size_t)&(((s *)0)->m) CC>#define FIELDOFFSET(type, field) ((short)&(((type *)0)->field))
CC>Хак, говоришь?
Здравствуйте, CreatorCray, Вы писали:
CC>Затем путем нехитрых но неприятных действий менеджмент производителя компилера донесёт до автора подобных "оптимизаций" простую и очевидную мысль: "нехрен выделываться".
Почему это получит? Это же по стандарту...
MSVC так не делает, но на какой-нибудь хитрой платформе компилятор вполне может так делать.
В С++ очень много чего для нужд реализации зарезервировано. Ключевые слова, например, макросами подменять, тоже нельзя...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
CC>>Затем путем нехитрых но неприятных действий менеджмент производителя компилера донесёт до автора подобных "оптимизаций" простую и очевидную мысль: "нехрен выделываться".
E>Почему это получит? Это же по стандарту...
А на самом деле многим крупным конторам плевать что там есть какой то стандарт.
Ты вспомни как МС приходилось обеспечивать совместимость багов и глюков версий винды.
С компилером будет то же самое.
E>MSVC так не делает, но на какой-нибудь хитрой платформе компилятор вполне может так делать.
Ни один известный мне компилер так не делает.
Потому как на самом деле разрешить замену стандартной библиотеки куда более логичное и правильное решение чем запрет ее менять.
Потому как бывает что на реальной задаче это реально нужно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Потому как на самом деле разрешить замену стандартной библиотеки куда более логичное и правильное решение чем запрет ее менять. CC>Потому как бывает что на реальной задаче это реально нужно.
Ну вот в лялихе, например, рантайм С -- это часть интерфейса системы фактически. Менять его нехорошо. Почему на какой-то платформе (например последовательно приплюснутой) не может быть такой же фигни и с STL?
Заменяемость стандартной библиотеки, кстати, стандарт не требует...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CreatorCray, Вы писали:
E>>Заменяемость стандартной библиотеки, кстати, стандарт не требует... CC>Зато иногда задача того требует.
Интересно, зачем? Можно же своей просто пользоваться?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>>>Заменяемость стандартной библиотеки, кстати, стандарт не требует... CC>>Зато иногда задача того требует.
E>Интересно, зачем? Можно же своей просто пользоваться?
а стандартную куда деть чтоб не путалась?
имеется в виду не просто STL а весь CRT
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>имеется в виду не просто STL а весь CRT
Дык CRT и так часто нельзя подменять. Например, если ты подменишь CRT в линуксе, что что будет с клеинтами malloc?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском