Bitfields,为什么具体实现?

Ske*_*een 11 c c++ standards bit-fields

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

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

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

Mat*_*son 8

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

特别是,必须以特定的位/字节顺序存储的位域将使其在自然字节顺序是"错误的方式"的机器上非常慢.

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

  • 不,它是完全可用的,只要你不要求它是直接便携的.请注意,对于许多体系结构,主要区别在于字节顺序,而不是位顺序,因此只要处理器相同,您就可以了.而且我敢肯定,如果效率不高(但非常便携且定义明确),大多数人会至少抱怨大声. (2认同)