C++ 为STD载体保留容量<;布尔>;模板特化
我正在研究类型C++ 为STD载体保留容量<;布尔>;模板特化,c++,c++11,templates,boolean,stdvector,C++,C++11,Templates,Boolean,Stdvector,我正在研究类型bool的std::vector的空间效率专门化,即std::vector。以下MWE创建对象并为其保留内存: #include <iostream> #include <vector> int main() { size_t nn{10}; std::vector<bool> theVector{}; theVector.reserve(nn); } 通过这样做: $ g++ -std=c++14 -g mwe.cpp -o m
bool
的std::vector
的空间效率专门化,即std::vector
。以下MWE创建对象并为其保留内存:
#include <iostream>
#include <vector>
int main() {
size_t nn{10};
std::vector<bool> theVector{};
theVector.reserve(nn);
}
通过这样做:
$ 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)
mwe.cpp处的断点1,main():6
6尺寸nn{10};
(gdb)n
7 std::vector theVector{};
(gdb)n
8.向量储备(nn);
(gdb)p向量
$1=std::长度为0的向量,容量为0
(gdb)n
7 std::vector theVector{};
(gdb)p向量
$2=std::长度为0的向量,容量为64
(gdb)
当我指定总容量为10时,为什么我的容量为64
之前的研究让我阅读了关于这个模板专门化的内容。我从中了解到,为了提高效率,此模板可能:
为了节省空间,它:
&v[0]+n!=&v[n]
)std::vector::reference
作为访问单个位的方法。特别是,此类的对象由操作符[]
按值返回std::allocator\u traits::construct
构造位值然而,我没有看到这些措施如何能够产生我所遇到的行为。正如评论中已经指出的,如果认为合适,则允许实现过度分配 您只在
std::vector
中看到这种情况,这表明这是由于元素内部存储的方式造成的
正如您已经了解到的,std::vector
通常专门用于通过将元素打包成更大的类型,将其元素以位的形式高效地存储在空间中
因此,实际容量将始终是可存储在较大类型中的位数的倍数。在本例中,所述类型似乎是64位宽的,可能是某个无符号的64位整数。
reserve
告诉它至少保留该数量。因为64>=10,这是完全正确的。
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)