C++ 位字段,为什么是特定于实现的?

C++ 位字段,为什么是特定于实现的?,c++,c,standards,bit-fields,C++,C,Standards,Bit Fields,C/C++位域似乎在硬件驱动程序和二进制网络传输中有很多应用。 然而,它们似乎没有被广泛使用,并且通常不鼓励使用,因为实际的二进制布局是特定于实现的,如C99标准6.7.2.1/10“结构和联合说明符”中的引用所示 一个实现可以分配任何足够大的可寻址存储单元来容纳一个位字段。如果仍有足够的空间,结构中紧跟在另一位字段之后的位字段应打包到同一单元的相邻位中。如果空间不足,则将定义是否将不适合的位字段放入下一个单元或与相邻单元重叠。单元内位字段的分配顺序(从高阶到低阶或从低阶到高阶)由实现定义。未指

C/C++位域似乎在硬件驱动程序和二进制网络传输中有很多应用。 然而,它们似乎没有被广泛使用,并且通常不鼓励使用,因为实际的二进制布局是特定于实现的,如C99标准6.7.2.1/10“结构和联合说明符”中的引用所示

一个实现可以分配任何足够大的可寻址存储单元来容纳一个位字段。如果仍有足够的空间,结构中紧跟在另一位字段之后的位字段应打包到同一单元的相邻位中。如果空间不足,则将定义是否将不适合的位字段放入下一个单元或与相邻单元重叠。单元内位字段的分配顺序(从高阶到低阶或从低阶到高阶)由实现定义。未指定可寻址存储单元的对齐方式


我的问题很简单,;为什么委员会决定将位字段保留为特定于实现的内容,从而使其成为编译器结构,主要用于减少内存使用,而在许多情况下,它可以用于提供良好的二进制布局,使开发人员从比特篡改代码中解放出来?

出于同样的原因,该标准没有严格规定许多其他事项:允许灵活地为大量平台和系统生成兼容的编译器,并且仍然拥有高效的编译器

特别是,位字段必须以特定的位/字节顺序存储,这将使其在自然字节顺序是“错误的方式”的机器上的速度非常慢


是的,这意味着让比特域在多个体系结构和平台之间可移植是一件很痛苦的事情。如果你真的需要,那么也许你应该考虑其他的解决办法…p> 我可以想象一些原因。。。持久性浮现在脑海中。但同时,将一个位字段部分放在一个字节中,部分放在另一个字节中,会对性能产生很大影响,因此委员会决定编译器可以自由选择如何执行,也许基于速度或大小优化的用户预置。我确信每个字节的位数不一定是8,这与它也有关系。@ Lister先生:为了确保一个字段在下一个字节中对齐,因此不在字节中间开始,我们得到了零大小的位字段,对吗?所以这已经在标准中了。@Lister先生:至于endianness,这是有道理的,但是他们可以添加一个说明符来强制指定一个特定的endianness,如果省略它,将默认为机器的endianness,这不仅可以解决位字段的问题,而且可以传输任何多字节数据结构。@Skeen:对,在这种情况下,标准委员会的默认行为是将其留给编译器。(实际上是本例中的硬件)你可以绞尽脑汁,争辩“为什么”,但这一切都只是对着雨大喊大叫。作为一种语言,C++的一个基本特征是,许多这些决策都是由实现来实现的。因此,至少在我的世界里,这意味着为了避免一个可能慢的特性,它们最终是一个不可使用的特征,不,它是完全可用的,只要你不要求它是直接的便携的。请注意,对于许多体系结构,主要区别在于字节顺序,而不是位顺序,因此只要处理器相同,就可以了。我敢肯定,如果它效率不高(但可移植性和定义良好),大多数人至少会大声抱怨。你可能是对的,尽管我宁愿有一个可移植的定义良好的位字段,然后在需要性能的时候自己动手摆弄。。但是你也可以从另一个角度来看待它——如果你想要严格的字节顺序和位顺序,你需要自己做位摆弄。如果你想要一个相当快速和可移植的东西(记住,只有当你在一台机器上存储二进制值,并在另一台机器上恢复二进制值,或者类似的东西会导致问题时,如果你不这样做,它就会工作得很好)。+1-一切都好。作为另一个说明性的复杂性,跨越两个字的位字段可能需要一个CPU上比另一个CPU上多得多的指令或惩罚时钟周期,从而导致对紧凑封装的不同态度。