выравнивание 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.