c++ - 为 STD 载体保留容量模板专业化
问题描述
我正在研究iestd::vector
类型的节省空间的专业化。以下 MWE 创建一个对象并为其保留内存: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
通过做这个:
$ 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)
当我指定总容量为 10 时,为什么我得到 64 的容量?
以前的研究使我阅读了有关此模板专业化的信息。我从cppreference.com了解到,为了提高效率,这个模板可能: 为了节省空间,它:
- 不一定将其元素存储为连续数组(so
&v[0] + n != &v[n]
) - 将类公开
std::vector<bool>::reference
为访问单个位的方法。特别是,这个类的对象是operator[]
按值返回的。 - 不
std::allocator_traits::construct
用于构造位值。 - 不保证同一个容器中的不同元素可以被不同的线程同时修改。
然而,我没有看到这些措施如何产生我遇到的行为。
解决方案
正如评论中已经指出的那样,如果发现合适,则允许实现过度分配。
您只看到这种情况发生的事实std::vector<bool>
表明这是由于元素在内部存储的方式。
正如您已经了解到的,std::vector<bool>
它通常专门用于通过将其元素打包成更大的类型来有效地将其元素存储为位。
因此,实际容量将始终是可存储在较大类型中的位数的倍数。在这种情况下,所述类型似乎是 64 位宽,可能是一些无符号的 64 位整数。
推荐阅读
- java - JOptionPane.showMessageDialog - 为什么要分解复选框?
- google-cloud-vision - google-cloud-vision 如何读取 pdf 文件
- mysql - 在 MySQL 8.0 (Mac OSX) 中将 secure_file_priv 设置为本地文件夹
- docker - Bamboo Docker 使用 Google Container Registry 构建错误
- python - 如何正确处理套接字异常
- python - 获取用于运行当前 Python 脚本的 Python 命令
- javascript - 在 React Web 应用程序中集成 firebase 时获得“权限被拒绝”
- shell - shell脚本变量类型由if语句中的第一个数据类型固定?
- javascript - React:如何显示默认对象并突出显示 li 粗体?
- python - 如何绘制我的数据框(python 和 pandas)