通常实现为单个位的布尔变量

Are boolean variables typically implemented as single bits?

本文关键字:单个位 布尔 变量 常实现 实现      更新时间:2023-10-16

可能的重复项:
单字节布尔值。为什么?

我想向类添加一个布尔变量。但是,这个类对大小非常敏感,因此我不愿意添加另一个字段。但是,它由一堆至少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>将两个布尔值打包成一个字节。