除了明显的节省空间的好处之外,位域是否有任何隐藏的成本或好处?
Do bitfields have any hidden costs or benefits aside from the obvious seeming benefit of saving space?
下面是声明位域的方法:
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(注:*)位域
位域在某些机器上跨分配单元,在其他机器上不跨分配单元。位域在一些机器上从右到左分配,在另一些机器上从左到右分配。
相关文章:
- 是否有任何C++功能可以对地图进行排序?
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- GoogleMock是否仍然打算与任何测试框架一起使用?
- C++中是否有任何函数等同于python中字典的get函数?
- 用于检查值是否为其任何参数的帮助程序函数
- 在实践中,在运行时为零的乘法中是否有任何"lazy"评估
- MPI:检查是否有任何进程已终止
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- C++ 移动语义是否在任何情况下都能节省资源?
- 在调用其析构函数之前,是否有任何实际理由检查某些东西是否可破坏?
- c++ 编译器是否保护常量内存地址免受任何更改?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 使用 std::addressof(std::cout) 而不是 &std::cout 是否有任何风险?
- 是否有任何区域设置会影响宽字符编码?
- 是否有任何模式等效于虚拟模板功能?
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 使用静态成员函数而不是普通函数是否有任何开销?
- 是否有任何 C 标准函数将值"1"传递给所有 (%s)