【问题标题】:Do bitfields have any hidden costs or benefits aside from the obvious seeming benefit of saving space?除了节省空间的明显好处之外,位域是否还有任何隐藏的成本或好处?
【发布时间】:2011-12-20 00:00:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ bit-fields


    【解决方案1】:

    可以将整数用作您自己访问和管理的位的集合。但是,您应该注意使用编译器生成的位字段(也可能是您自己的位字段)通常有un-thought-of costs

    【讨论】:

    • 上周我一直在疯狂地搜索这篇博文,并在这里偶然发现了它。非常感谢。
    • @pmr:我更改了标题,希望下次您疯狂的谷歌搜索更有可能找到答案。 :-)
    【解决方案2】:

    在我看来,说位域有一些隐藏的好处与事实相去甚远,这会更好地表达它们使用的隐藏缺点。


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

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


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

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

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

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

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

    位域的对齐是实现定义的。


    读取/访问这些类型的成员也可能会失败,今天的大多数编译器都可以将这些指令优化为相当快,尽管没有人说会是这种情况,并且它可以创建大量运行时如果编译器不像你那样思考,则会产生开销。


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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-21
      • 2023-02-13
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      相关资源
      最近更新 更多