以下在 g++ 4.8.2
上运行的程序在 32 位 Linux 系统上给出了输出 12:
vector<char> v;
cout << sizeof(v) << endl;
我看到了this并且知道 sizeof(v)
可能是特定于实现的。不过,我想知道是什么导致该 vector 的大小为 12。我认为迭代器 v.begin()
和 v.end()
可能贡献了 8 个字节的大小。我对么?如果是,剩余 4 个字节大小的贡献是什么?如果不是,这 12 个字节是什么意思?
最佳答案
查看源代码。 libstdc++
是 gcc 下载的一部分。
无论如何,容器必须有这些成员:
- 一个数据指针,4 个字节用于
char*
。 - 元素计数或结束指针,
size_t
或char*
为 4 个字节。 - 缓冲区大小或指向缓冲区末尾的指针,
size_t
或char*
为 4 个字节。 - 标准分配器(空的普通类型)不需要空间,这要归功于一些实现技巧(空基类优化,可能还有部分模板特化。C++20 可以使用 the attribute
[[no_unique_address]]
代替)。
理论上,如果不是指针,2 和 3 可能更小。虽然这会很奇怪,因为它会限制最大尺寸。
同样在理论上,2 和 3 可以随数据动态分配。不过还没有发现有人真正这样做过。
一共 12 个字节,符合预期。
将 64 位实现的大小加倍。
关于c++ - 空 vector 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27935802/