【问题标题】:Reserving capacity for an STD vector<bool> template specialization为 STD 向量<bool> 模板特化保留容量
【发布时间】:2018-05-24 22:27:35
【问题描述】:

我正在研究 std::vector 类型 bool 即 std::vector&lt;bool&gt; 的节省空间的专业化。以下 MWE 创建一个对象并为其保留内存:

#include <iostream>
#include <vector>

int main() {
  size_t nn{10};
  std::vector<bool> theVector{};
  theVector.reserve(nn);
}

但是,当我编译这个 MWE 时:

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609

通过这样做:

$ g++ -std=c++14 -g mwe.cpp -o mwe

然后使用调试:

$ gdb --version
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1

我得到以下输出:

Breakpoint 1, main () at mwe.cpp:6
6     size_t nn{10};
(gdb) n
7     std::vector<bool> theVector{};
(gdb) n
8     theVector.reserve(nn);
(gdb) p theVector 
$1 = std::vector<bool> of length 0, capacity 0
(gdb) n
7     std::vector<bool> theVector{};
(gdb) p theVector 
$2 = std::vector<bool> of length 0, capacity 64
(gdb) 

当我指定总容量为 10 时,为什么我得到了 64 的容量?

之前的研究让我了解了这个模板专业化。我从cppreference.com 了解到,为了提高效率,这个模板可以: 为了节省空间,它:

  1. 不一定将其元素存储为连续数组(所以&amp;v[0] + n != &amp;v[n])
  2. 公开std::vector&lt;bool&gt;::reference 类作为访问单个位的方法。特别是,此类的对象由operator[] 按值返回。
  3. 不使用std::allocator_traits::construct 构造位值。
  4. 不保证同一容器中的不同元素可以被不同线程同时修改。

但我没有看到这些措施如何产生我遇到的行为。

【问题讨论】:

  • reserve 告诉它保留至少该金额。由于 64>=10,这完全没问题。

标签: c++ c++11 templates boolean stdvector


【解决方案1】:

正如 cmets 中已经指出的那样,如果实现认为合适,则允许过度分配。

您只看到std::vector&lt;bool&gt; 发生这种情况的事实表明这是由于元素在内部存储的方式造成的。

正如您已经了解到的,std::vector&lt;bool&gt; 通常专门用于通过将其元素打包成更大的类型来节省空间地将其元素存储为位。

因此,实际容量将始终是可存储在较大类型中的位数的倍数。在这种情况下,所述类型似乎是 64 位宽,可能是一些无符号的 64 位整数。

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    相关资源
    最近更新 更多