保留STD向量<bool>模板专业化

时间:2018-05-24 22:27:35

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

我正在考虑类型std::vector bool std::vector<bool>的节省空间的专精化,即#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

然而,当我用以下代码编译这个MWE时

$ 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) 

我得到以下输出:

&v[0] + n != &v[n]

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

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

  1. 不一定将其元素存储为连续数组(所以std::vector<bool>::reference
  2. 将类operator[]公开为访问各个位的方法。特别是,此类的对象由std::allocator_traits::construct按值返回。
  3. 不使用const forecast = [ {date: "2018-05-24", temp_min: 49.87, temp_max: 57.1}, {date: "2018-05-24", temp_min: 49.08, temp_max: 53.9}, {date: "2018-05-24", temp_min: 54.52, temp_max: 56.93}, {date: "2018-05-24", temp_min: 61.8, temp_max: 61.8}, {date: "2018-05-24", temp_min: 66.58, temp_max: 66.58}, {date: "2018-05-25", temp_min: 68.64, temp_max: 68.64}, {date: "2018-05-25", temp_min: 66.33, temp_max: 66.33}, {date: "2018-05-25", temp_min: 62.41, temp_max: 62.41}, {date: "2018-05-25", temp_min: 58.97, temp_max: 58.97}, {date: "2018-05-25", temp_min: 55.15, temp_max: 55.15}, {date: "2018-05-25", temp_min: 56.24, temp_max: 56.24}, {date: "2018-05-25", temp_min: 59.29, temp_max: 59.29}, {date: "2018-05-25", temp_min: 65.89, temp_max: 65.89}, {date: "2018-05-26", temp_min: 67.96, temp_max: 67.96}, {date: "2018-05-26", temp_min: 65.05, temp_max: 65.05}, {date: "2018-05-26", temp_min: 59.42, temp_max: 59.42}, {date: "2018-05-26", temp_min: 55.52, temp_max: 55.52}, {date: "2018-05-26", temp_min: 52.17, temp_max: 52.17}, {date: "2018-05-26", temp_min: 53.06, temp_max: 53.06}, {date: "2018-05-26", temp_min: 58.72, temp_max: 58.72}, {date: "2018-05-26", temp_min: 63.51, temp_max: 63.51} ]; const getForecastForDay = Object.values(resultsDateMod.reduce((acc,cur)=> Object.assign(acc,{ [cur.date]:cur} ),{})) const threeDayForecast = getforecastForDay.slice(0,3); threeDayForecast 来构造位值。
  4. 不保证同一容器中的不同元素可以由不同的线程同时修改。
  5. 然而,我没有看到这些措施如何能够产生我遇到的行为。

1 个答案:

答案 0 :(得分:3)

正如评论中已经指出的那样,如果发现合适的话,允许实施过度分配。

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

正如您已经了解到的那样,std::vector<bool>通常专门用于通过将元素打包成更大的类型来空间有效地将其元素存储为位。

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