关于c ++:struct的大小超过预期

Size of struct is more than expected

本问题已经有最佳答案,请猛点这里访问。

我已经阅读了这个问题:C++中的结构填充,这一个为什么Sigeof的结构不等于每个成员的sisiof的总和?

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

为什么X64系统上的结构16的大小?

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

有效尺寸是8+1=9,但我知道有填充物。不管怎么说,我认为a只能被填充到int的大小,也就是说,其他3个字节总共有12个字节。

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

猜测:最大的类型(例如double或在本例中是x64指针)是否可能指定要使用的填充?


编译器可能在8字节的字边界上对齐结构,以提高访问速度。如果访问没有对齐,9大小的结构可能会使CPU速度慢很多(加上堆栈指针不应该位于奇数地址上)。12个字节(3个填充字节)的大小是可以工作的,但是一些操作,如fpu操作,更喜欢8或16个字节的对齐。


这是因为记忆对齐。默认情况下,内存不是按一个字节顺序排列的,这会发生。内存分配在32位系统上的4字节块上。

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