C++ 为什么';tc++;让结构更紧密?

C++ 为什么';tc++;让结构更紧密?,c++,packing,C++,Packing,例如,我有一个类 class naive { public: char a; long long b; char c; int d; }; -表示未使用 为什么C++不能使它更紧,比如 ac--dddd bbbbbbbb ac—dddd bbbbbbbbbb 标准要求类和结构成员按照声明顺序存储在内存中。因此,在您的示例中,d不可能出现在b之前 此外,大多数架构更喜欢多字节类型在4字节或8字节边界上对齐。因此,编译器所能做的就是在类成员之间保留空的填充字节 您可以

例如,我有一个

class naive { public: char a; long long b; char c; int d; };
-
表示未使用

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

ac--dddd bbbbbbbb ac—dddd bbbbbbbbbb
标准要求类和结构成员按照声明顺序存储在内存中。因此,在您的示例中,
d
不可能出现在
b
之前

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


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

GCC等价于
#pragma pack
uu属性((打包))
。在C++11中,这变得标准化,属性为
alignas
。具体而言,9.2.12(非联合的非静态数据成员)中对内存中数据成员顺序相同的要求进行了编码在没有插入访问说明符的情况下声明的类被分配,以便以后的成员在ISO/IEC 14882:2003标准的类对象中具有更高的地址。[…])。@Kevin-C标准这样说,因为这是C标准化时的工作方式。可能是一些“聪明”的代码利用了这一点。@Kevin-声明具有标头和可变长度正文的对象的一个常见的老派技巧是,使用长度为1(或长度为零,如果编译器允许)的伪数组结束标头结构,然后使用malloc sizeof(标头)+长度\正文。然后可以使用虚拟数组索引到主体中。如果可以将虚拟对象重新排序到结构的开头,这将不起作用。@凯文:在大多数情况下,这样您就可以将映射到硬件寄存器、网络协议、文件格式和类似结构的RAM区域表示为C结构。
bbbb ddddac
将更加紧凑,您不必在后面填充2个字节 ac--dddd bbbbbbbb