【发布时间】:2018-05-24 22:27:35
【问题描述】:
我正在研究 std::vector 类型 bool 即 std::vector<bool> 的节省空间的专业化。以下 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 了解到,为了提高效率,这个模板可以: 为了节省空间,它:
- 不一定将其元素存储为连续数组(所以
&v[0] + n != &v[n]) - 公开
std::vector<bool>::reference类作为访问单个位的方法。特别是,此类的对象由operator[]按值返回。 - 不使用
std::allocator_traits::construct构造位值。 - 不保证同一容器中的不同元素可以被不同线程同时修改。
但我没有看到这些措施如何产生我遇到的行为。
【问题讨论】:
-
reserve告诉它保留至少该金额。由于 64>=10,这完全没问题。
标签: c++ c++11 templates boolean stdvector