При поддерживаемой упаковке pack(4), 8-битном байте и обычном ABI программа выведет 16. Сумма размеров полей равна 14, но размер структуры включает хвостовое выравнивание.
Что выведет данная программа
При поддерживаемой упаковке pack(4), 8-битном байте и обычном ABI программа выведет 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;
}
Ответ
При поддерживаемой упаковке pack(4), 8-битном байте и обычном ABI программа выведет 16. Сумма размеров полей равна 14, но размер структуры включает хвостовое выравнивание.
Поля располагаются со смещений 0, 8 и 12. Последнее поле заканчивается на 14; ещё два байта обеспечивают кратность размера выравниванию структуры, равному 4.
pragma pack является расширением реализации. Поэтому нельзя утверждать этот результат для любого компилятора независимо от его поддержки директивы. Значения 10, 20 и 30 влияют на содержимое объекта, а не на sizeof.
Источник: learn.microsoft.com.