可能重复:
一字节布尔值。为什么?
我想向一个类添加一个布尔变量。但是,这个类对大小非常敏感,因此我不愿意添加另一个字段。然而,它是由一堆至少一个char
宽的成员和一个其他的组成的bool
。
如果我手写这段代码,我会将这些布尔字段实现为对象最后一个字节左右的位。由于访问必须是字节对齐的,这不会导致空间开销。
现在,编译器通常会这样做吗?我可以让他们不这样做的唯一原因是因为它会涉及一个额外的掩码来让那个位离开那里。
可能重复:
一字节布尔值。为什么?
我想向一个类添加一个布尔变量。但是,这个类对大小非常敏感,因此我不愿意添加另一个字段。然而,它是由一堆至少一个char
宽的成员和一个其他的组成的bool
。
如果我手写这段代码,我会将这些布尔字段实现为对象最后一个字节左右的位。由于访问必须是字节对齐的,这不会导致空间开销。
现在,编译器通常会这样做吗?我可以让他们不这样做的唯一原因是因为它会涉及一个额外的掩码来让那个位离开那里。
不,编译器无法做到这一点,因为每个成员的地址必须是不同的。如果要打包固定数量的位,请使用std::bitset
. 如果您需要可变数量的位数,请使用boost::dynamic_bitset
.
不,我不知道有任何编译器可以优化布尔值。
您可以通过以下方式强制执行此行为:
unsigned int m_firstBit : 1;
unsigned int m_secondBit : 1;
unsigned int m_thirdBit : 1;
至于为什么不这样做,它可能会违反一些语言保证。例如,如果它没有自己的保留字节,则无法传递&myBool
给采用 a 的函数。bool*
编译器通常不这样做,但您可以使用std::bitset<2>
将两个布尔值打包成一个字节。