【问题标题】:Efficient use of boolean true and false in C++?在 C++ 中有效使用布尔真假?
【发布时间】:2013-02-28 11:50:03
【问题描述】:

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

过去,有些语言的编译器可以将布尔数组压缩为每个布尔值仅一位的表示形式。也许对 C++ 来说最好的方法是使用 std::vector<char> 来存储布尔值以最小化内存使用?

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

【问题讨论】:

  • vector<bool> 很奇怪(至少与其他类型的向量相比),但它是vector 的特化,因此被区别对待。

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


【解决方案1】:

std::vector

专业

标准库为 bool 类型提供了 std::vector 的特化,针对空间效率进行了优化。
vector 节省空间的动态位集 (类模板特化)

来自“C++ 工作草案,2012-11-02”

23.3.7 类向量 [vector.bool]
1 为了优化空间分配,提供了一个专门针对 bool 元素的向量:
模板 类向量 {
...
}

3 不要求将数据存储为布尔值的连续分配。建议使用空间优化的位表示。

因此,将bool 值存储为位没有要求,只是建议。

【讨论】:

    【解决方案2】:

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

    您可以阅读更多here

    您可能还想探索标准的bitset

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 标准实际上并不要求这个,不是吗?
        • @jogojapan:你说的很对,这不是必需的,但没有优化。
        • 为什么它是一个缺陷?如果它不是必需的,为什么它在标准中,因为它本身就像一个矢量一样走路和说话?
        • @AnuragKalia:这是一个缺陷,因为std::vector<bool> 确实不会vector 那样走路和说话。它不符合序列容器的要求,并且它公开的迭代器不符合 RandomAccessIterators 的要求。 (特别是,通常返回对元素的引用的函数改为返回代理对象,其行为与引用相似但不完全相同)。
        • 担心的是vector<bool> 不提供满足交互器要求的交互器。这被广泛认为是交互器要求中的一个缺陷,并且正在逐步得到解决。
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-05
          • 1970-01-01
          • 1970-01-01
          • 2019-01-06
          • 2013-10-13
          • 2013-12-09
          相关资源
          最近更新 更多