C++ - CSTYLE结构/类包装相关

C++ - cstyle structure/class packing pertinent?

本文关键字:包装 CSTYLE 结构 C++      更新时间:2023-10-16

上下文

我主要用 C 语言编码。尝试 c++。

不够好,无法告诉自己。但正在改善。

问题

struct AND 类是否受益于 c++ 中的结构打包,或者它只是一个 c'ish 的东西?

c++增加了很多魔力吗?

私有/受保护/公共部分会搞砸吗?

谢谢

C++结构

100%向后兼容C结构。所有相同的规则都适用。类只是一个结构,其中默认值是私有的而不是公共的。因此,相同的规则仍然适用。您可以按照应用的正常 C 对齐和填充规则指定的顺序获取结构/类的所有成员。

但是不要去告诉编译器打包你的结构或类。编译器通常插入的额外填充意味着可以更快地访问成员。打包结构需要更多的 CPU 时间来访问成员(主要是在 x86/amd64 上(或更复杂的代码来执行未对齐的访问(几乎所有其他 CPU(。

打包结构的唯一好理由是将结构存储在文件中或通过网络传输它们,其中不同系统的不同对齐和填充规则会导致不兼容。如果需要,请在保存/发送之前尽可能晚地将数据打包到打包结构中,并在读取/接收后尽快将其解压缩到未打包的结构中。您可以同时进行字节序转换。

首先有两个不同的术语data structure alignmentdata structure padding

数据对齐意味着将数据放在等于字大小的某个倍数的内存偏移量处,由于 CPU 处理内存的方式,这提高了系统的性能。

为了对齐数据,可能需要在最后一个数据结构的末尾和下一个数据结构的开头之间插入一些无意义的字节,即数据结构填充。

对于您的问题"Do struct AND classes benefit from structure packing in c++"

尽管 C 和 C++ 不允许编译器对结构成员进行重新排序以节省空间,但其他语言可能。也可以将结构most C and C++ compilers to "pack" the members分辨到一定程度的对齐方式,例如"pack(2("表示将大于一个字节的数据成员对齐到两个字节的边界,以便任何填充成员最多有一个字节长。

通过更改结构中成员的顺序,可以更改保持对齐所需的填充量。例如,如果成员按降序对齐要求排序,则需要最少量的填充,这意味着在结构中排列元素,开头最大。