C / C ++位域似乎在硬件驱动程序和二进制网络传输中有很多应用。 然而,它们似乎并没有被广泛使用,并且通常不鼓励,因为实际的二进制布局是特定于实现的,如C99标准6.7.2.1/10中的引用所示 - “结构和联合说明符”;
实现可以分配足够大的任何可寻址存储单元来保存位域。如果剩余足够的空间,则紧跟在结构中的另一个位字段之后的位字段将被打包到相同单元的相邻位中。如果剩余的空间不足,则是否将不适合的位域放入下一个单元或重叠相邻单元是实现定义的。单元内的位域分配顺序(高阶到低阶或低阶到高阶)是实现定义的。可寻址存储单元的对齐未指定。
我的问题很简单;为什么委员会决定将位字段保留为特定于实现的东西,从而使其成为编译器构造,主要用于减少内存使用,在许多情况下它可用于提供良好的二进制布局,并且免费开发人员来自苦涩的代码?
答案 0 :(得分:8)
出于同样的原因,标准没有严格规定许多其他内容:允许灵活地为大量平台和系统生成兼容的编译器,并且仍然具有EFFICIENT编译器。
特别是,必须以特定的位/字节顺序存储的位域会使其自然字节顺序为“错误的方式”的机器上的速度非常慢。
是的,这意味着在多个构架和平台上使位域可移植是一种正确的痛苦。如果你确实需要,那么也许你应该考虑其他一些解决方案......