При обычном ABI с sizeof(bool)=1 и выравниванием int16_t/int32_t на 2/4 байта получится A size: 8 и B size: 12. Разница возникает из-за промежутков выравнивания.
Определение размеров структур при выводе в консоль
При обычном ABI с sizeof(bool)=1 и выравниванием int16_t/int32_t на 2/4 байта получится A size: 8 и B size: 12. Разница возникает из-за промежутков выравнивания.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно понять, какой текст появится в консоли после выполнения представленного ниже кода.
#include <iostream>
struct A {
bool _a;
bool _b;
int16_t _c;
int32_t _d;
};
struct B {
bool _a;
int32_t _b;
int16_t _c;
bool _d;
};
int main(int argc, char* argv[])
{
std::cout << "A size: " << sizeof(A) << std::endl;
std::cout << "B size: " << sizeof(B) << std::endl;
return 0;
}
Ответ
При обычном ABI с sizeof(bool)=1 и выравниванием int16_t/int32_t на 2/4 байта получится A size: 8 и B size: 12. Разница возникает из-за промежутков выравнивания.
В A смещения полей: 0, 1, 2 и 4; конец структуры приходится на 8. В B: 0, 4, 8 и 10; после последнего bool добавляется хвостовое заполнение до 12.
Это не универсальные размеры языка: упаковка, выравнивание и размер bool зависят от реализации. Для целочисленных типов подключите ; переносимый код может использовать std::int16_t и std::int32_t. Порядок байтов сам по себе эти размеры не определяет.