C ++ 11

时间:2017-01-20 08:22:23

标签: c++ c++11 vector stdvector

我们为什么要使用vector<char>代替vector<bool>vector<char>更快的原因是什么?

3 个答案:

答案 0 :(得分:9)

std::vector<bool>std::vector<T>的专业化,主要用于提高空间效率(有争议)。但是,它的行为与常规std::vector<T> 的行为相似但不相同。这主要归因于std::vector<bool>不是通常的C ++标准库意义上的容器,而是一个位数组。 std::vector<bool>和常规std::vector之间的一些差异是:

  • std::vector<bool>::iterator不是随机访问迭代器。
  • std::vector<bool>不需要将其元素存储为连续数组。
  • std::vector<bool>公开class std::vector<bool>::reference作为访问单个位的方法。特别是,此类的对象由operator[]std::vector<bool>::frontstd::vector<bool>::back按值返回。
  • std::vector<bool>不使用std::allocator_traits::construct来构造位值。
  • std::vector<bool>不保证同一容器中的不同元素可以由不同的线程同时修改。
  • std::vector<bool>有不同的界面(即flip()

除了将std::vector的概念含义打破为连续容器之外,这些差异也会破坏用户代码,特别是当此代码是通用的(即模板代码)时。

澄清以下例子:

template<class T> void foo(std::vector<T> &v) {
 T &frnt = v.front();
 ...
}

以上示例适用于T以外的每个T = bool。如前所述,失败的原因是v.front()的返回值是临时的(按值返回),因此无法绑定到引用。

为避免这种破坏,许多程序员避免使用std::vector<bool>而更喜欢使用std::vector<char>。由于引起的许多问题,许多人都说使用std::vector<bool>可能被视为过早优化。为解决这个问题,许多杰出的C ++社区成员提出了建议。其中一个提议建议以不同的名称删除std::vector<bool>,它不会引用C ++标准库容器。

现在到时间性能问题,std::vector<bool>的主要问题是其各自的std::algorithm算法未针对它进行优化。因此,虽然你可以通过使用它获得空间,但它的使用可能会导致非常显着的速度悲观。

参考书目

  1. vector: More Problems, Better Solutions, Herb Sutter
  2. On vector<bool>, Howard Hinnant
  3. std::vector<bool>

答案 1 :(得分:5)

vector<bool>是一个位数组。 vector<char>是一个字节数组。前者使用较少的空间来换取更复杂的索引操作。

vector<char>实际上是否更快可能是架构的功能,尤其是缓存。如果您的vector<bool>完全适合x86_64上的L1缓存,则可能比vector<char>更快。

如果表现很重要,通常的建议适用于衡量您申请表现的效果。

答案 2 :(得分:2)

  

我们为什么要使用vector<char>代替vector<bool>

通常,您不希望更喜欢vector<char>

  

vector<char>更快的原因是什么?

通常,vector<char>往往会变慢。

让我们讨论vector<bool>的缺点。

  

cppreference:同一容器中的不同元素可以由不同的线程同时修改,但std::vector<bool>

的元素除外

如果需要同时修改同一容器中的单独元素,则std::vector<bool>必须受锁保护,而vector<char>则不受保护。 vector<char>的简单代码是一个明显的优势,假设高并行性可能更有效。如果您确实有这种情况,请不要忘记考虑虚假共享,但不要忘记测量。

霍华德·亨南特写了一篇article来讨论vector<bool>的利弊。简短版的专业人士:

  

如果正确实施,通常会对bool数据结构数组进行空间和速度优化。

缺点的简称:

  

然而,它的行为并不像一个bool数组,因此不应该假装为一个。

本文的论点并不是你不应该使用vector<bool>,而是vector<bool>应该是vector的特化之外的东西,因为它不完全符合那个接口它很专业。