为啥 C++ 不使结构更紧密?

Posted

技术标签:

【中文标题】为啥 C++ 不使结构更紧密?【英文标题】:Why doesn't C++ make the structure tighter?为什么 C++ 不使结构更紧密? 【发布时间】:2011-10-07 12:33:14 【问题描述】:

例如,我有一个class

类天真 民众: 字符一个; 长长 b; 字符 c; 诠释d; ;

根据我的测试程序,ad 是一个接一个地构建的,就像

一种 - - - - bbbbbbbb c---dddd

- 表示未使用。

为什么 C++ 不让它更紧密,比如

ac--dddd bbbbbbbb

【问题讨论】:

bbbbbbbbddddac 会更紧,你不必在后面填充 2 个字节 【参考方案1】:

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

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

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

【讨论】:

#pragma pack 的 GCC 等效项是 __attribute__ ((packed))。在 C++11 中,这变得标准化,属性为 alignas 具体来说,数据成员在内存中的顺序相同的要求在 9.2.12 中进行了编码(分配了没有中间访问说明符的(非联合)类的非静态数据成员,因此以后的成员在类对象中具有更高的地址。[...])符合 ISO/IEC 14882:2003 标准。 @Kevin - C 标准是这样说的,因为这是 C 标准化时的工作方式。大概是一些“聪明”的代码利用了这一点。 @Kevin - 用头和可变长度主体声明对象的一个​​常见的老派技巧是用长度为 1 的虚拟数组结束头结构(如果编译器允许,则长度为零) ,然后是 malloc sizeof(header)+length_of_body。然后,您可以使用虚拟数组对正文进行索引。如果可以将 dummy 重新排序到结构的开头,这将不起作用。 @Kevin:在大多数情况下,您可以将映射到硬件寄存器、网络协议、文件格式和类似结构的 RAM 区域表示为 C 结构。

以上是关于为啥 C++ 不使结构更紧密?的主要内容,如果未能解决你的问题,请参考以下文章

在不使结构只读的情况下避免使用带有结构的“in”对性能造成的影响?

为啥回调比承诺更“紧密耦合”?

为啥我什至应该考虑在 C++ 中使用结构? [复制]

数据结构与算法原理基本关系和原理

为啥 C++ 中的以下结构声明会导致退出 127?

为啥指向未定义结构的指针有时在 C 和 C++ 中是非法的