我想知道C ++中的bools是否实际上是1位变量。 我正在为我的内核开发PMM并且使用(可能是多维的)bool-array会很安静。但是如果C ++中的bool是8位长的话,我不想浪费空间......
编辑:bool [8]那么1字节长吗?还是8字节?我可以在使用gcc时声明类似bool bByte[8] __attribute__((packed));
的内容吗?
正如我所说:我正在编写内核。所以我不能包括标准的图书馆。
答案 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)
可寻址内存的最小单位是char
。 bool[N]
或std::array<bool, N>
将使用与char[N]
或std::array<char, N>
一样多的空间。
标准允许(尽管不是必需的)std::vector<bool>
的实现可以专门用于将位打包在一起。