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

Do bitfields have any hidden costs or benefits aside from the obvious seeming benefit of saving space?

本文关键字:是否 任何 位域 隐藏 节省 空间      更新时间:2023-10-16

下面是声明位域的方法:

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

位域就是一个以位为单位的小域。

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

使用int作为您自己访问和管理的位的集合是可以的。然而,使用编译器生成的位字段(也可能是您自己的)通常会有您应该意识到的未考虑到的代价。

说位字段有一些隐藏的好处,在我看来很遗憾,这与事实相去甚远,不如表达使用它们的隐藏缺点。


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

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


作为旁注,并没有说下面的结构体的大小将是1字节:

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

这是因为在结构体之后可能会有填充,如果你真的不走运的话,两个字段之间也会有填充。

c++标准(草案n1905): 9.6/1位域

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

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


读/访问这些类型的成员也可以是一个失败,今天大多数编译器可以优化这些指令相当快,虽然没有说这将是这种情况,它可以创建大量的运行时开销,如果编译器不认为你做的。


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

c++标准(草案n1905): 9.6/1(注:*)位域

位域在某些机器上跨分配单元,在其他机器上不跨分配单元。位域在一些机器上从右到左分配,在另一些机器上从左到右分配。