| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Специальные поля в заголовках структур и классов |
| Автор: marcusmae 18.8.2008, 13:42 |
| Здравствуйте, В каких случаях в заголовке структур и классов перед данными располагаются специальные поля типа указателя на таблицу виртуальных функций? Интересует вообще всё, что может находиться между адресом экземпляра и адресом верхнего поля. Если случаев немного, то перечислите, пожалуйста, кратко и / если нет подскажите, где почитать. Кстати, стандарт на этот счёт что-то определяет?.. Спасибо. |
| Автор: bsa 18.8.2008, 14:25 |
| Думаю, что если это и есть, то компиляторозависимо. |
| Автор: Alek86 18.8.2008, 14:51 |
| стандарт говорит, что это не определено и размер класса и расположение данных внутри него - на совести компилятора |
| Автор: UnrealMan 18.8.2008, 15:56 | ||||
Правильно сделал, что спросил: тебе нагло наврали (тут такое нередко бывает
|
| Автор: Daevaorn 18.8.2008, 16:00 |
| И где наврали? |
| Автор: SABROG 18.8.2008, 16:08 | ||||
Такую фигню накатал.
Выдало:
Т.е. 112 байт затерялось где-то между классами при выделении памяти через new, а в стеке все идет по-порядку. Компилятор gcc, спец. заголовков перед данными не видать. Т.е. пока адрес класса равен адресу первого члена данных. |
| Автор: marcusmae 18.8.2008, 16:18 | ||
UnrealMan, спасибо,
- что означает термин intervening access-specifier? Обычные спецификаторы доступа - private-public-protected, да? Если перевести на доступный язык, то получается, что в рамках секции с некоторым доступом все поля-значения размещаются ровно в том порядке, в каком они перечисленны в классе. Очень мило, что поля-указатели не оговариваются Второй тезис вообще пока не могу воткнуть SABROG, спасибо, Будет гораздо интереснее, если Вы продолжите анализ, введя виртуальные функции и/или множественное наследование. |
| Автор: UnrealMan 18.8.2008, 16:39 | ||||||
Да.
Если между двумя нестатическими членами-данными не находится access-specifier, то больший адрес имеет тот, что объявлен позже. При этом между членами могут быть пустоты. Касаемо POD-структур гарантируется, что объект такой структуры и его первый нестатический член-данное могут быть преобразованы друг в друга посредством reinterpret_cast:
|
| Автор: Alek86 18.8.2008, 16:55 | ||||
а теперь покажи, где я наврал я ответил, на вопрос
ответ - не определено |
| Автор: marcusmae 18.8.2008, 17:04 | ||||||
Ну да. Именно это я и наблюдаю чаще всего. Alek86, из цитаты следует, что порядок следования членов определён в некоторой степени. Вы сказали, что это на совести компилятора. Но это не то, что я спрашивал : иногда случаются пустоты перед первым членом - хорошо, если стандарт этого не оговаривает (а он именно не оговаривает : написано, что не определено и не оговаривается - не одно и то же), то можно ли говорить хотя бы о каких-то закономерностях?
- круто! А для reinterpret_cast нужен rtti? |
| Автор: Alek86 18.8.2008, 17:15 | ||
а, точно, я и про порядок говорил не знал... имхо, лучше на этот счет вообще не париться. делать сериализацию и не морочить себе голову |
| Автор: UnrealMan 18.8.2008, 18:47 | ||||||
Для POD-структуры гарантируется, что перед первым нестатическим членом-данным не может быть никаких неименованных пустот (см. примечание во второй приведённой мной цитате из п. 9.2 стандарта), а также что адрес её первого нестатического члена-данного совпадает с адресом её экземпляра (следствие из двух приведённый мной цитат). Это, по-твоему, можно расценивать как полное отсутвие в стандарте информации по данному топику? Добавлено через 31 секунду Нет. |
| Автор: bsa 18.8.2008, 20:03 |
| блин. а я грешным делом подумал, что речь идет о чем-то, что находится до адреса, на который указывает указатель |
| Автор: Alek86 18.8.2008, 20:56 | ||
стандарт на работе - завтра погляжу а из 2х цитат сейчас следует только то, что reinterpret_cast обязан приводить указатель на ПОД к указателю на первое поле... если в примечании написано то, чтоговоришь, тогда я был неправ |
| Автор: UnrealMan 18.8.2008, 22:33 | ||||||
Я ни от кого не прятал это примечание:
Какие тут могут быть сомнения? |
| Автор: MAKCim 19.8.2008, 17:19 |
| вот поэтому (и не только) ядра ОС на С++ и не пишут по мотивам http://forum.vingrad.ru/forum/topic-220786.html топика |
| Автор: marcusmae 19.8.2008, 17:57 | ||||||
MAKCim, спасибо,
да, убедились на практике |