在C ++中有效使用布尔值true和false?

时间:2013-02-28 03:26:48

标签: c++ memory optimization compiler-construction storage

任何编译器专家都能评论布尔值的有效使用吗?具体来说,编译器是否能够优化std::vector<boolean>以使用最少的内存?是否存在等效的数据结构?

在当天,有些语言的编译器可以将布尔数组压缩为每布尔值只有一位的表示。或许可以为C ++做的最好的事情是使用std::vector<char>存储布尔值以最小化内存使用量?

这里的用例将存储数亿个布尔值,其中单个字节可以节省大量空间,每个值超过4个字节或更多字节,甚至更多。

5 个答案:

答案 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)

stol :: vector for bool是一个模板专业化,可以满足您的要求。

您可以阅读更多here

您可能还想探索标准bitset

答案 2 :(得分:1)

注意,vector<bool>不是容器,但它假装为1并提供迭代器。 如果您将其视为普通容器,可能会导致混淆和错误的一天,例如试图获得元素的地址。

如果您需要为每个布尔值存储1位,则可以考虑std::bitsetboost::dynamic_bitset。这些数据结构不会伪装成容器,因此在使用任何数据时都不会出现任何错误,尤其是在模板代码中。

答案 3 :(得分:0)

在被广泛认为是标准中的缺陷的情况下,std::vector专门用于使用单个位来表示每个bool值。

如果这恰好是您正在寻找的,那么就使用它。

答案 4 :(得分:0)

作为保证高效存储的标准不可知方式,您可以创建自己的Bitvector类。基本上每8 bool个值,您只需要分配一个char,然后您可以将每个bool存储在一个位中。然后,您可以在访问器/更改器中使用位移技术来存储/检索您的各个位。

Ron Penton和AndréLaMothe的Data Structures for Game Programmers概述了一个这样的例子(我也建议将其作为一般数据结构参考)。虽然我自己编写的并不是很难,但是,尽管我没有仔细搜索过,但互联网上可能还有其他一些例子。