可能重复:
One-byte bool. Why?
我想在类中添加一个布尔变量。但是,这个类的大小非常敏感,因此我不愿意添加另一个字段。但是,它由一堆至少char
宽的成员和一个其他bool
成员组成。
如果我手写这段代码,我会将这些布尔字段实现为对象的最后一个字节左右的位。由于访问必须是字节对齐的,因此不会产生空间开销。
现在,编译器通常会这样做吗?我可以为他们做的唯一原因是因为它会涉及一个额外的掩码,以便从那里获得那一点。
答案 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打包成一个字节。