结构的大小超过预期
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
块。
我已经读过这个问题: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
块。