关于打包:为什么C ++不能使结构更紧凑?

Why doesn't C++ make the structure tighter?

例如,我有一个class

1
2
3
4
5
6
7
class naive {
public:
    char a;
    long long b;
    char c;
    int d;
};

根据我的测试程序,ad是一个接一个的构建,比如

1
2
3
a-------
bbbbbbbb
c---dddd

-表示未使用。

为什么C++不能使它更紧,比如

1
2
ac--dddd
bbbbbbbb


标准要求类和结构成员以声明它们的相同顺序存储在内存中。所以在您的示例中,d不可能出现在b之前。

而且,大多数体系结构更喜欢多字节类型在4或8字节边界上对齐。所以编译器所能做的就是在类成员之间保留空的填充字节。

您可以通过自己对成员重新排序来最小化填充,按大小顺序递增或递减。或者您的编译器可能有一个#pragma pack选项或类似的选项,它将以牺牲性能和代码大小为代价来尽量减少填充。阅读编译器的文档。