通常实现为单个位的布尔变量
Are boolean variables typically implemented as single bits?
可能的重复项:
单字节布尔值。为什么?
我想向类添加一个布尔变量。但是,这个类对大小非常敏感,因此我不愿意添加另一个字段。但是,它由一堆至少char
宽的成员和单个其他bool
组成。
如果我手写这段代码,我会将这些布尔字段实现为对象最后一个字节左右的位。由于访问必须以字节对齐,因此不会导致空间开销。
现在,编译器通常会做这个技巧吗?我能让他们不这样做的唯一原因是因为它会涉及一个额外的面具来摆脱那里。
不,编译器不能做这个技巧,因为每个成员的地址必须是不同的。如果要打包固定位数的位数,请使用 std::bitset
。如果需要可变位数的位数,请使用 boost::dynamic_bitset
.
不,我不知道有任何编译器可以将布尔值优化到一点。
您可以通过以下方式强制此行为:
unsigned int m_firstBit : 1;
unsigned int m_secondBit : 1;
unsigned int m_thirdBit : 1;
至于为什么不这样做,它可能会违反一些语言保证。例如,如果函数没有自己的保留字节,则无法将&myBool
传递给采用bool*
的函数。
编译器
通常不会这样做,但您可以使用std::bitset<2>
将两个布尔值打包成一个字节。
相关文章:
- 将uint64_t位掩码转换为 std::布尔数组
- CRC32 C++使用布尔数组和手动逐位异或实现
- 布尔值是否需要在C++中表示为真时设置为 1 位/假时设置为 0 位
- Armadillo是否支持布尔和8位型矩阵和立方体
- 如何使用位操作在单个整数中编码和解码两个数字
- 如何使用布尔参数为按位运算符启用C++警告
- 将 __m128i?布尔数组中每个布尔字节的低位提取到打包的位图
- 具有单个参数的布尔函数映射
- 在布尔值中设置额外的位使其同时为真和为假
- 任何可以在单个 CPU 指令中在 0 和 1 之间翻转位/整数/布尔值的可能代码
- 在单个if语句中测试多个布尔值
- 如何将单个位转换为字符
- 你能在C++中按位移动布尔值吗?
- 编译器中的布尔值为 8 位.对它们的操作是否效率低下
- 使用位操作将8字节数字中的每个字节中的一位转换为单个字节
- 是-!(condition)从布尔值(mask-boolean)中获得完整位向量的正确方法
- 在c++中存储和访问N维位数组中单个位的最快方法是什么?
- 如何使操作符[]返回对unsigned int中单个位的引用
- 支持单个位偏移的类似"memcpy"的功能?
- 通常实现为单个位的布尔变量