除了节省空间的明显好处之外,位域是否有任何隐藏的成本或收益?

时间:2011-12-20 00:00:22

标签: c++ bit-fields

这是你如何声明一个位域:

unsigned m_bitfield1 : 2;  // a bitfield that occupies 2 bits
unsigned m_bitfield2 : 1;  // a bitfield that occupies 1 bit

位字段只是一个具有特定大小的小字段。

我的问题是:我可以使用自己的算法来处理默认数据类型,例如整数或浮点数,它占用了大量不必要的空间,作为任意大小的较小部分的集合,或者使用位域有一些隐藏的好处吗?谢谢。

2 个答案:

答案 0 :(得分:9)

将int用作您自己访问和管理的位集合是很好的。但是,通常un-thought-of costs使用编译器生成的位字段(可能还有您自己的),您应该知道。

答案 1 :(得分:6)

根据我的说法,说比特字段有一些隐藏的好处,遗憾的是远离事实,它会更好地表达它们使用的隐藏缺点。


回答你的问题;是的,当然你可以编写自己的算法来处理任意长度的这些位字段作为完全不同的东西。

虽然没有获取字段长度m_bitfield1(使用宏或其他)的方法,但您需要自己跟踪它。


作为旁注,没有什么可以说下面的结构大小为1个字节:

struct Obj {unsigned bitfield1 : 3; unsigned bitfield2 : 5;}; // 8 bits total

这是因为结构之后的潜在填充,以及两个字段之间的填充,如果你真的不走运。

  

C ++标准版(草案n1905):9.6 / 1位字段

     

类对象中位域的分配是实现定义的。

     

位字段的对齐是实现定义的。


读取/访问这些类型的成员也可能是一个垮台,今天大多数编译器可以相当快地优化这些指令,虽然没有什么说会是这种情况,它可以创建大量的运行时如果编译器没有像你那样思考,就会产生开销。


位字段在内存中出现的顺序也是实现定义的,这可能导致不可移植的代码在两个不同的系统上导致相同的事情。

  

C ++标准版(草案n1905):9.6 / 1 [注:*]位字段

     

位字段跨越某些机器上的分配单元而不是其他机器上的分配单元。在某些机器上从右到左分配位字段,在其他机器上从左到右分配。