выравнивание uint32 t на 64-разрядном?
мне интересно выравнивание типов uint32_t на 64-битных платформах. Спецификация говорит, что uint32_t должен быть точно заданной битовой шириной, которая действительно кажется:
> printf("sizeof(uint32_t): %zdn", sizeof(uint32_t));
sizeof(uint32_t): 4
но тогда у меня есть структура:
typedef struct A {
uint32_t a;
uint32_t b;
} A;
но, на удивление:
> printf("sizeof(A): %zdn", sizeof(A));
sizeof(A): 16
по какой-то причине uint32_t выровнен по 8 байтам? Это действительно 8-байтовый тип внизу?
2 ответов
Это всецело зависит от вашего компилятора и архитектуры. В вашем случае похоже, что поля действительно выровнены по 8 байтам, возможно, по соображениям производительности.
Я предполагаю, что по умолчанию все в 64-битной архитектуре будет выровнено по 64-битным границам, как и в 32-битной архитектуре, все выровнено по 4 байтам. Вы можете указать директивы pragma упаковки, чтобы избавиться от заполнения. Например
#pragma pack(0)
в gcc.