我们为什么要使用vector<char>
代替vector<bool>
? vector<char>
更快的原因是什么?
答案 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>::front
,std::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 :(得分: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>
的简单代码是一个明显的优势,假设高并行性可能更有效。如果您确实有这种情况,请不要忘记考虑虚假共享,但不要忘记测量。
vector<bool>
的利弊。简短版的专业人士:
如果正确实施,通常会对bool数据结构数组进行空间和速度优化。
缺点的简称:
然而,它的行为并不像一个bool数组,因此不应该假装为一个。
本文的论点并不是你不应该使用vector<bool>
,而是vector<bool>
应该是vector的特化之外的东西,因为它不完全符合那个接口它很专业。