11

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

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

我的问题很简单;为什么委员会决定将位字段保留为特定于实现的东西,从而使其成为编译器构造,主要用于减少内存使用,在许多情况下它可以用来提供漂亮的二进制布局,并且免费来自比特摆弄代码的开发人员?

4

1 回答 1

8

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

特别是,必须以特定的位/字节顺序存储位域会使其在自然字节顺序是“错误方式”的机器上变得非常慢。

是的,这意味着让位域在多个架构和平台上可移植是一个正确的痛苦。如果你真的需要那个,那么也许你应该考虑其他一些解决方案......

于 2013-07-18T12:48:03.140 回答