有编译器专家能够对布尔值的有效使用发表评论吗? 具体来说,编译器是否能够优化
std::vector<boolean>
以使用最少的内存? 是否有等效的数据结构?
过去,有些语言的编译器可以将布尔值数组压缩为每个布尔值仅一位的表示形式。 也许对 C++ 来说最好的办法就是使用
std::vector<char>
来存储布尔值以最小化内存使用?
这里的用例将存储数亿个布尔值,其中单个字节将节省每个值 4 个或更多字节以及单个位的大量空间,甚至更多。
std::vector
专业
标准库为 bool 类型提供了 std::vector 的特化,它针对空间效率进行了优化。
矢量节省空间的动态位集 (类模板专业化)
以及来自“C++ 工作草案,2012-11-02”
23.3.7 类向量 [vector.bool]
1 为了优化空间分配,提供了 bool 元素向量的特化:
模板类向量 {
...
}3 不要求将数据存储为布尔值的连续分配。建议使用空间优化的位表示。
因此,没有要求,只是建议将
bool
值存储为位。
注意,
vector<bool>
不是一个容器,但它假装是一个容器并提供迭代器。
有一天,如果您将其视为普通容器,例如,可能会导致混乱和错误。试图获取元素的地址。
如果您需要为每个布尔值存储 1 位,您可以考虑
std::bitset
或 boost::dynamic_bitset。这些数据结构不会伪装成容器,因此在使用它们中的任何一个时都不太可能犯任何错误,尤其是在模板代码中。