【发布时间】:2011-10-07 12:33:14
【问题描述】:
例如,我有一个class,
根据我的测试程序,a 到 d 是一个接一个地构建的,就像
- 表示未使用。
为什么 C++ 不让它更紧,比如
ac--dddd bbbbbbbb【问题讨论】:
-
bbbbbbbbddddac会更紧,你不必在后面填充 2 个字节
例如,我有一个class,
根据我的测试程序,a 到 d 是一个接一个地构建的,就像
- 表示未使用。
为什么 C++ 不让它更紧,比如
ac--dddd bbbbbbbb【问题讨论】:
bbbbbbbbddddac 会更紧,你不必在后面填充 2 个字节
标准要求类和结构成员以与声明它们相同的顺序存储在内存中。因此,在您的示例中,d 不可能出现在 b 之前。
此外,大多数架构更喜欢多字节类型在 4 或 8 字节边界上对齐。所以编译器所能做的就是在类成员之间留下空的填充字节。
您可以通过自己重新排序成员来最小化填充,以增加或减少大小顺序。或者你的编译器可能有一个#pragma pack 选项或类似的东西,它会试图以牺牲性能和代码大小为代价来最小化填充。阅读编译器的文档。
【讨论】:
#pragma pack 的 GCC 等效项是 __attribute__ ((packed))。在 C++11 中,这变得标准化,属性为 alignas。