为 STD 向量 <bool> 模板特化保留容量
Reserving capacity for an STD vector<bool> template specialization
我正在查看 std::vector
类型 bool
的 space 高效专业化,即 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
= std::vector<bool> of length 0, capacity 0
(gdb) n
7 std::vector<bool> theVector{};
(gdb) p theVector
= std::vector<bool> of length 0, capacity 64
(gdb)
为什么我指定的总容量为 10,却得到 64 的容量?
之前的研究让我了解了这个模板专业化。我从 cppreference.com 了解到,为了高效,这个模板可能:
为了 space 高效,它:
- 不一定将其元素存储为连续数组(因此
&v[0] + n != &v[n]
)
- 公开class
std::vector<bool>::reference
作为访问单个位的方法。特别是,class 的对象由 operator[]
按值返回。
- 不使用
std::allocator_traits::construct
构造位值。
- 不保证同一容器中的不同元素可以被不同线程并发修改。
但我看不出这些措施如何产生我遇到的行为。
正如评论中已经指出的那样,如果发现合适,允许实现过度分配。
您只看到 std::vector<bool>
发生这种情况表明这是由于元素在内部存储的方式所致。
如您所知,std::vector<bool>
通常专门用于 space - 通过将其元素打包成一些更大的类型来有效地将其存储为位。
因此,实际容量将始终是较大类型中可存储位数的倍数。在这种情况下,所述类型似乎是 64 位宽,可能是一些无符号的 64 位整数。
我正在查看 std::vector
类型 bool
的 space 高效专业化,即 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
= std::vector<bool> of length 0, capacity 0
(gdb) n
7 std::vector<bool> theVector{};
(gdb) p theVector
= std::vector<bool> of length 0, capacity 64
(gdb)
为什么我指定的总容量为 10,却得到 64 的容量?
之前的研究让我了解了这个模板专业化。我从 cppreference.com 了解到,为了高效,这个模板可能: 为了 space 高效,它:
- 不一定将其元素存储为连续数组(因此
&v[0] + n != &v[n]
) - 公开class
std::vector<bool>::reference
作为访问单个位的方法。特别是,class 的对象由operator[]
按值返回。 - 不使用
std::allocator_traits::construct
构造位值。 - 不保证同一容器中的不同元素可以被不同线程并发修改。
但我看不出这些措施如何产生我遇到的行为。
正如评论中已经指出的那样,如果发现合适,允许实现过度分配。
您只看到 std::vector<bool>
发生这种情况表明这是由于元素在内部存储的方式所致。
如您所知,std::vector<bool>
通常专门用于 space - 通过将其元素打包成一些更大的类型来有效地将其存储为位。
因此,实际容量将始终是较大类型中可存储位数的倍数。在这种情况下,所述类型似乎是 64 位宽,可能是一些无符号的 64 位整数。