任何编译器专家都能评论布尔值的有效使用吗?具体来说,编译器是否能够优化std::vector<boolean>
以使用最少的内存?是否存在等效的数据结构?
在当天,有些语言的编译器可以将布尔数组压缩为每布尔值只有一位的表示。或许可以为C ++做的最好的事情是使用std::vector<char>
存储布尔值以最小化内存使用量?
这里的用例将存储数亿个布尔值,其中单个字节可以节省大量空间,每个值超过4个字节或更多字节,甚至更多。
答案 0 :(得分:5)
请参阅std::vector
专业化
标准库为bool类型提供了std :: vector的特化,它针对空间效率进行了优化 矢量&lt; BOOL&GT;节省空间的动态比特集 (课程模板专业化)
和“Working C ++,2012-11-02”
23.3.7类向量[vector.bool]
1为了优化空间分配,提供了bool元素向量的特化:
template&lt; class Allocator&gt; class vector&lt; bool,Allocator&gt; {
...
}3不要求将数据存储为bool值的连续分配。建议使用空格优化的位表示。
所以没有要求,只有建议,将bool
值存储为位。
答案 1 :(得分:1)
答案 2 :(得分:1)
注意,vector<bool>
不是容器,但它假装为1并提供迭代器。
如果您将其视为普通容器,可能会导致混淆和错误的一天,例如试图获得元素的地址。
如果您需要为每个布尔值存储1位,则可以考虑std::bitset
或boost::dynamic_bitset。这些数据结构不会伪装成容器,因此在使用任何数据时都不会出现任何错误,尤其是在模板代码中。
答案 3 :(得分:0)
在被广泛认为是标准中的缺陷的情况下,std::vector专门用于使用单个位来表示每个bool
值。
如果这恰好是您正在寻找的,那么就使用它。
答案 4 :(得分:0)
作为保证高效存储的标准不可知方式,您可以创建自己的Bitvector
类。基本上每8 bool
个值,您只需要分配一个char
,然后您可以将每个bool
存储在一个位中。然后,您可以在访问器/更改器中使用位移技术来存储/检索您的各个位。
Ron Penton和AndréLaMothe的Data Structures for Game Programmers概述了一个这样的例子(我也建议将其作为一般数据结构参考)。虽然我自己编写的并不是很难,但是,尽管我没有仔细搜索过,但互联网上可能还有其他一些例子。