为啥 C++ 不使结构更紧密?
Posted
技术标签:
【中文标题】为啥 C++ 不使结构更紧密?【英文标题】:Why doesn't C++ make the structure tighter?为什么 C++ 不使结构更紧密? 【发布时间】:2011-10-07 12:33:14 【问题描述】:例如,我有一个class
,
根据我的测试程序,a
到 d
是一个接一个地构建的,就像
-
表示未使用。
为什么 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++ 不使结构更紧密?的主要内容,如果未能解决你的问题,请参考以下文章