结构的大小超过预期

Size of struct is more than expected

我已经读过这个问题:struct padding in c++ and this one Why isn't sizeof for a struct equal to the sum of sizeof of each member?

我知道这不是标准化的,但我仍然相信这是一个合法的问题。

为什么这个结构体的大小在 x64 系统上是 16?

struct foo { char* b; char a;};

有效大小为 8 + 1 = 9,但我知道其中涉及填充。无论如何,我认为 a 只会被填充以达到 int 的大小,即与其他 3 个字节一起给出总共 12 个字节。

特定编译器 (gcc) 认为它的大小应该为 16 个字节有什么原因吗?

大胆猜测:最大的类型(例如双精度或本例中的 x64 指针)是否可能决定使用的填充?

可能编译器将结构对齐到 8 字节字边界以提高访问速度。大小为 9 的结构可能会使 CPU 因未对齐访问而变慢很多(加上堆栈指针永远不应该在奇数地址上)。大小为 12(3 个填充字节)会起作用,但某些操作(如 FPU 操作)更喜欢 8 或 16 字节的对齐方式。

这是因为内存对齐。默认情况下,内存未按一个字节顺序对齐,并且会发生这种情况。在 32 位系统上,内存分配在 4 字节块上。

您可以在定义结构时通过设置 __attribute__((packed, aligned(x))) 来更改此行为。通过此内存分配 x-byte 块。