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]
  • 公开class
    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)