布尔变量通常是作为单个位实现的吗?

时间:2013-01-30 23:42:12

标签: c++ visual-c++ gcc compiler-construction

  

可能重复:
  One-byte bool. Why?

我想在类中添加一个布尔变量。但是,这个类的大小非常敏感,因此我不愿意添加另一个字段。但是,它由一堆至少char宽的成员和一个其他bool成员组成。

如果我手写这段代码,我会将这些布尔字段实现为对象的最后一个字节左右的位。由于访问必须是字节对齐的,因此不会产生空间开销。

现在,编译器通常会这样做吗?我可以为他们做的唯一原因是因为它会涉及一个额外的掩码,以便从那里获得那一点。

3 个答案:

答案 0 :(得分:3)

不,编译器无法做到这一点,因为每个成员的地址必须是不同的。如果要打包固定数量的位,请使用std::bitset。如果您需要可变位数,请使用boost::dynamic_bitset

答案 1 :(得分:2)

不,我不知道任何编译器可以将bool优化到一点。

您可以通过以下方式强制执行此操作:

unsigned int m_firstBit : 1;
unsigned int m_secondBit : 1;
unsigned int m_thirdBit : 1;

至于原因,可能会违反某些语言保障。例如,如果&myBool没有自己的保留字节,则无法将bool*传递给{{1}}。

答案 2 :(得分:0)

编译器通常不这样做,但您可以使用std::bitset<2>将两个bool打包成一个字节。

相关问题