为什么C++不能使结构更紧凑?

Dan*_*ode 28 c++ packing

例如,我有一个class,

class naive {
public:
    char a;
    long long b;
    char c;
    int d;
};

根据我的测试程序,ad被陆续建成,像

a-------
bbbbbbbb
c---dddd

- 意味着未使用

为什么C++不能让它变得更紧,比如

ac--dddd
bbbbbbbb

Gra*_*and 56

标准要求类和结构成员按照声明它们的顺序存储在内存中.所以在你的例子中,以前不可能d出现b.

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

您可以通过自行重新排序成员来减少填充,增加或减少大小顺序.或者您的编译器可能有一个#pragma pack选项或类似的东西,它将寻求以可能的性能和代码大小为代价来最小化填充.阅读编译器的文档.

  • GCC相当于`#pragma pack`是`__attribute __((packed))`.在C++ 11中,这变得标准化,属性为"alignas". (11认同)
  • 具体而言,数据成员在内存中的顺序相同的要求在9.2.12中编纂(在没有插入访问说明符的情况下声明的(非联合)类的非静态数据成员被分配,以便后面的成员在一个内部具有更高的地址) ISO/IEC 14882:2003标准的类对象.[...]). (7认同)
  • @Kevin - 用于声明具有标题和可变长度主体的对象的常见老派技巧是使用长度为1的虚拟数组结束标头结构(如果编译器允许,则为长度为零),然后是malloc sizeof(标题) + length_of_body.然后,您可以使用虚拟数组索引到正文.如果假人可以重新排序到结构的开头,这将不起作用. (6认同)
  • @Kevin:在大多数情况下,您可以表示映射到硬件寄存器,网络协议,文件格式和类似C结构的结构的RAM区域. (4认同)
  • @Kevin - C标准这样说,因为这是C标准化时的工作方式.据推测,一些"聪明"的代码利用了这一点. (3认同)