我已经阅读了这个问题:struct padding in c++和此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指针)会指定要使用的填充吗?
答案 0 :(得分:11)
可能编译器正在将结构与8字节字边界对齐以提高访问速度。结构大小为9可能会在未对齐访问的情况下减慢CPU的速度(加上堆栈指针永远不应该在奇数地址上)。大小为12(3个填充字节)可行,但某些操作(如FPU操作)更喜欢8或16字节的对齐。
答案 1 :(得分:1)
这是因为内存对齐。默认情况下,内存未按顺序排列,这种情况就会发生。内存分配在32位系统上的4字节块上。
您可以在定义结构时设置__attribute__((packed, aligned(x)))
来更改此行为。通过此内存分配在x-byte
块上。