При обычной поддержке #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.