结构的大小超过预期

时间:2015-10-06 15:14:45

标签: c++ memory struct

我已经阅读了这个问题: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指针)会指定要使用的填充吗?

2 个答案:

答案 0 :(得分:11)

可能编译器正在将结构与8字节字边界对齐以提高访问速度。结构大小为9可能会在未对齐访问的情况下减慢CPU的速度(加上堆栈指针永远不应该在奇数地址上)。大小为12(3个填充字节)可行,但某些操作(如FPU操作)更喜欢8或16字节的对齐。

答案 1 :(得分:1)

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

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

相关问题