我在C中的初始代码 尝试c ++。
装配不好告诉自己。但正在改进。
结构和类是否受益于c ++中的结构打包,还是仅仅是一件好事?
c ++会增加很多魔力吗?
私人/受保护/公共部门是否一团糟?
由于
答案 0 :(得分:1)
C ++ struct与C struct 100%向后兼容。所有相同的规则都适用。而class只是一个结构,默认是私有而不是公共。所以相同的规则仍然适用。您可以按照使用正常C对齐和填充规则指定的顺序获取struct / class的所有成员。
但是不要告诉编译器打包你的结构或类。编译器正常插入的额外填充意味着可以更快地访问成员。打包的结构需要更多的CPU时间来访问成员(主要是在x86 / amd64上)或更复杂的代码来进行未对齐的访问(几乎所有其他的cpu)。
打包结构的唯一理由是将结构存储在文件中或通过网络传输它们,不同系统的不同对齐和填充规则会导致不兼容。如果需要,那么在savin / send之前尽可能晚地将数据打包到压缩结构中,并在读取/接收后尽快将其解压缩到非压缩结构中。您可以同时进行endian转换。
答案 1 :(得分:0)
首先,有两个不同的术语data structure alignment
和data structure padding
。
数据对齐意味着将数据放入存储器偏移量等于字大小的某个倍数,这会因CPU处理内存的方式而提高系统性能。
要对齐数据,可能需要在最后一个数据结构的末尾和下一个数据结构的开头之间插入一些无意义的字节,即数据结构填充。
对于您的问题"Do struct AND classes benefit from structure packing in c++"
虽然C和C ++不允许编译器重新排序结构成员以节省空间,但其他语言可能会。也可以将结构most C and C++ compilers to "pack" the members
告知某种程度的对齐,例如: "组(2)"表示将大于一个字节的数据成员与两字节边界对齐,以便任何填充成员最多只有一个字节长。
通过更改结构中成员的顺序,可以更改维持对齐所需的填充量。例如,如果成员按降序对齐要求进行排序,则需要最少量的填充,这意味着在结构中将元素排列在开头的最大值。