C ++:bool是1位变量吗?

时间:2017-05-21 20:14:36

标签: c++ memory-management kernel

我想知道C ++中的bools是否实际上是1位变量。 我正在为我的内核开发PMM并且使用(可能是多维的)bool-array会很安静。但是如果C ++中的bool是8位长的话,我不想浪费空间......

编辑:bool [8]那么1字节长吗?还是8字节?我可以在使用gcc时声明类似bool bByte[8] __attribute__((packed));的内容吗? 正如我所说:我正在编写内核。所以我不能包括标准的图书馆。

3 个答案:

答案 0 :(得分:4)

不存在像1位变量这样的事情。

可以用c ++解决的最小单位是unsigned char

  

bool [8]那么1个字节长吗?

没有

  

或8字节?

不一定。取决于目标机器unsigned char所占的位数。

  

但如果C ++中的bool长8位,我不想浪费空间......

使用std::bitset处理位时可以避免浪费空间,如果需要动态调整大小,可以避免boost::dynamic_bitset

正如@zett42 in their comment所指出的那样,你也可以使用位域结构来解决单个位(但出于缓存对齐的原因,这可能会占用更多的空间):

struct S {
    // will usually occupy 4 bytes:
    unsigned b1 : 1, 
             b2 : 1,
             b3 : 1;
};

答案 1 :(得分:1)

bool使用至少一个(可能更多)字节的存储空间,所以是的,至少8位。

然而,vector<bool>通常只在一位中存储bool,并且以代理迭代器的形式存在一些聪明之处,并且(通常)模仿对实际bool个对象的访问,即使这不是他们存储的东西。最初的C ++标准需要这个。最近的那些放宽了允许vector<bool>实际上是你通常期望的要求(即,只是一堆bool个对象的要求。尽管有宽松的要求,但是相当多的实施仍然以vector<bool>的包装形式存储它们。

但是,请注意,其他容器类型也不例外 - 例如,list<bool>deque<bool> 无法使用位打包表示。< / p>

另请注意,由于需要代理迭代器(等),使用比特打包表示存储的vector<bool>无法满足对普通容器的要求,因此您需要小心在你对他们的期望中。

答案 2 :(得分:-2)

可寻址内存的最小单位是charbool[N]std::array<bool, N>将使用与char[N]std::array<char, N>一样多的空间。

标准允许(尽管不是必需的)std::vector<bool>的实现可以专门用于将位打包在一起。