Определение размеров структур при выводе в консоль

При обычном 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. Порядок байтов сам по себе эти размеры не определяет.

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

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

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

Подробнее