结构体的大小超出了预期

14 浏览
0 Comments

结构体的大小超出了预期

这个问题已经有答案了:

为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?

我已经阅读了这个问题:C++ 中的结构体填充 和这个问题 为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?

我知道这不是标准化的,但我仍然认为这是一个合理的问题。

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

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

有效的大小应该是8 + 1 = 9,但我知道涉及到了填充。不管怎样,我认为只有有需要填充以达到 int 的大小,也就是其他 3 个字节共计 12 字节。

是否有任何理由,让这个特定的编译器(gcc)认为它应该拥有16个字节的大小?

猜测:最大的类型(例如 double 或在这种情况下的 x64 指针)是否会决定要使用的填充?

admin 更改状态以发布 2023年5月21日
0
0 Comments

这是因为内存对齐的原因。默认情况下,内存没有对齐为一字节的顺序,这会发生。在32位系统上,内存以4字节块分配。

您可以在定义结构时设置__attribute__((packed,aligned(x)))来更改此行为。通过这种方式,内存将按x字节块分配。

0
0 Comments

很可能编译器将结构体在8字节的字边界上对齐,以提高访问速度。大小为9的结构体可能会通过未对齐的访问方式对CPU造成相当大的影响(此外,堆栈指针不应该位于奇数地址上)。大小为12(3个填充字节)的结构体可以使用,但某些操作(例如FPU操作)更喜欢8或16字节的对齐方式。

0