Как рассчитать sizeof Foo и Bar с учётом padding?

При заданной модели Foo занимает 12 байт, Bar — 16. Const не делает поле бесплатным: d хранится в объекте; размеры с виртуальностью зависят от выбранного ABI.

Короткий ответ

Что ответить на собеседовании

При заданной модели Foo занимает 12 байт, Bar — 16. Const не делает поле бесплатным: d хранится в объекте; размеры с виртуальностью зависят от выбранного ABI.

Подробный разбор

Ответ с пояснениями

Условие

Даны Foo { char c; int i; const char d = 0; } и Bar с виртуальным деструктором и полями char c; int i;. Используется учебная модель ABI: char имеет размер/выравнивание 1, int — 4; Bar начинается с vptr размером и выравниванием 8. Поля идут по порядку, итог округляется до выравнивания объекта. Найдите размеры.

Ответ

При заданной модели Foo занимает 12 байт, Bar — 16. Const не делает поле бесплатным: d хранится в объекте; размеры с виртуальностью зависят от выбранного ABI.

У Foo c лежит на смещении 0, затем 3 байта padding, i — на 4, d — на 8, после чего размер округляется с 9 до 12. У Bar vptr занимает 0–7, c — смещение 8, i — 12–15: итог уже кратен 8. Стандарт C++ не требует именно такого vptr и общего layout, поэтому числа верны для явно заданной модели, а не для любой платформы.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее