我对uint32_t类型在64位平台上的对齐方式很好奇。规范指出uint32_t应该恰好具有给定的位宽,实际上似乎是这样的:
> printf("sizeof(uint32_t): %zd\n", sizeof(uint32_t));
sizeof(uint32_t): 4
但是我有一个结构体:
typedef struct A {
uint32_t a;
uint32_t b;
} A;
然而,令人惊讶的是:
> printf("sizeof(A): %zd\n", sizeof(A));
sizeof(A): 16
uint32_t 是否因为某种原因被8字节对齐?在底层它真的是一个8字节类型吗?
uint32_t
的对齐要求必须小于或等于sizeof(uint32_t)
。由于uintN_t
类型中不允许填充,因此sizeof(uint32_t) * CHAR_BIT == 32
。其他任何情况都不符合C99标准。但是,根据C99标准,您的struct A
的对齐方式可以比任何成员的最大对齐方式更大。 - Steve Jessop