例如,我有class
,
class naive { public: char a; long long b; char c; int d; };
根据我的测试程序,a
到d
是一个接一个地构建的,例如
a------- bbbbbbbb c---dddd
-
表示未使用。
为什么C ++不会让它更紧凑,比如
ac--dddd bbbbbbbb
答案 0 :(得分:56)
标准要求类和结构成员按照声明它们的顺序存储在内存中。因此,在您的示例中,d
无法在b
之前出现。
此外,大多数架构更喜欢多字节类型在4字节或8字节边界上对齐。所以编译器可以做的就是在类成员之间留下空填充字节。
您可以通过自行重新排序成员来减少填充,增加或减少大小顺序。或者您的编译器可能具有#pragma pack
选项或类似的选项,这将寻求以可能的性能和代码大小为代价来最小化填充。阅读编译器的文档。