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

При обычной поддержке #pragma pack(4) и 8-битном байте размер A равен 16 байтам. Поля занимают 14 байт, а ещё два байта добавляются в конце для выравнивания структуры.

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

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

При обычной поддержке #pragma pack(4) и 8-битном байте размер A равен 16 байтам. Поля занимают 14 байт, а ещё два байта добавляются в конце для выравнивания структуры.

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

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

Условие

Нужно понять, какой результат будет напечатан при запуске следующей программы.

# include <cstdint>
# include <iostream>

# pragma pack(4)

struct A
{
    uint64_t Value1 = 10;
    uint32_t Value2 = 20;
    uint16_t Value3 = 30;
};

int main()
{
    std::cout << sizeof(A) << std::endl;
    return 0;
}

Ответ

При обычной поддержке #pragma pack(4) и 8-битном байте размер A равен 16 байтам. Поля занимают 14 байт, а ещё два байта добавляются в конце для выравнивания структуры.

Расположение полей: Value1 со смещения 0, Value2 со смещения 8, Value3 со смещения 12. Конец последнего поля — смещение 14; общий размер округляется до кратного выравниванию 4.

Инициализаторы значений на размер не влияют. pragma pack — расширение компилятора, а не универсальная гарантия C++; для переносимого утверждения нужно знать компилятор и ABI. В заголовках настройку обычно ограничивают парой pack(push, 4) и pack(pop).

Источник: learn.microsoft.com.

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

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

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

Подробнее