64位系统上的uint32_t对齐是多少?

6

我对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字节类型吗?


1
编译器是什么,架构又是什么? - ouah
请注意,由于数组的工作方式,uint32_t的对齐要求必须小于或等于sizeof(uint32_t)。由于uintN_t类型中不允许填充,因此sizeof(uint32_t) * CHAR_BIT == 32。其他任何情况都不符合C99标准。但是,根据C99标准,您的struct A的对齐方式可以比任何成员的最大对齐方式更大。 - Steve Jessop
@steve 那么单独的uint32_t成员不能填充,但整个结构体可以吗?那样做有什么好处?两个32位成员会自然地给您提供64位对齐。 - gct
@gct:我不知道你的编译器认为有什么好处。可能它是在说,在8字节地址上访问4字节值更有效率,因此它希望'b'是8字节对齐的。 - Steve Jessop
3个回答

6

这完全取决于您的编译器和架构。在您的情况下,看起来字段确实是按8字节对齐的,可能是出于性能考虑。


2

我猜默认情况下,64位架构的所有内容都会与32位架构一样对齐到4个字节,而在64位架构上则对齐到64位边界。您可以指定打包编译指令来消除填充。例如:

#pragma pack(0)

在gcc中。

奇怪的是,如果我使用pack(1),那么上面的两个元素的结构体仍然会给我16,但是如果我再添加一个uint32_t,我会得到20...令人困惑。 - gct

0

在Linux上使用gcc和64位CPU,我得到了预期的结果:具有两个short int的结构体大小为4,具有两个32位int的结构体大小为8,而具有两个64位int的结构体大小为16。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接