我正在考虑类型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了解到,为了提高效率,这个模板可以: 为了节省空间,它:
std::vector<bool>::reference
)operator[]
公开为访问各个位的方法。特别是,此类的对象由std::allocator_traits::construct
按值返回。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
来构造位值。然而,我没有看到这些措施如何能够产生我遇到的行为。
答案 0 :(得分:3)
正如评论中已经指出的那样,如果发现合适的话,允许实施过度分配。
您只看到std::vector<bool>
发生这种情况的事实表明这是由于元素在内部存储的方式。
正如您已经了解到的那样,std::vector<bool>
通常专门用于通过将元素打包成更大的类型来空间有效地将其元素存储为位。
因此,实际容量将始终是可以存储在较大类型中的位数的倍数。在这种情况下,所述类型似乎是64位宽,可能是一些无符号的64位整数。