空向量的大小

Size of empty vector

运行 g++ 4.8.2 上的以下程序在 32 位 Linux 系统上给出了输出 12:

vector<char> v;
cout << sizeof(v) << endl;

我看到 this 并且知道 sizeof(v) 可能是特定于实现的。不过,我想知道是什么导致该向量的大小为 12。我认为迭代器 v.begin()v.end() 可能会导致大小为 8 个字节。我对么?如果是,剩余 4 个字节大小的贡献是什么?如果不是,这12个字节是什么意思?

查看源代码。 libstdc++ 是 gcc 下载的一部分。

无论如何,容器必须有这些成员:

  1. 一个数据指针,4 个字节用于 char*
  2. 元素计数或结束指针,size_tchar* 的 4 个字节。
  3. 缓冲区大小或指向缓冲区末尾的指针,size_tchar* 为 4 个字节。
  4. 标准分配器(空的平凡类型)不需要 space,这要归功于一些实现技巧(空基类优化,也许还有部分模板特化。C++20 可以使用 the attribute [[no_unique_address]] 代替)。

理论上,如果不是指针,2 和 3 可能更小。虽然这会很好奇,因为它会限制最大尺寸。

同样在理论上,2 和 3 可以随数据动态分配。不过还没有发现有人真正这样做过。

一共 12 个字节,符合预期。
将 64 位实现的大小加倍。

通常 std::vector 有:

1. Start of allocation / begin
2. End of vector (begin + size)
3. End of allocation (begin + capacity)

所以大小 12 在 32 位机器上是非常合理的。

libstdc++ 的 std::vector 派生自具有此类型数据成员的基:

  struct _Vector_impl
  : public _Tp_alloc_type
  {
    pointer _M_start;
    pointer _M_finish;
    pointer _M_end_of_storage;
    ...

_M_end_of_storage 支持 .capacity() / 调整大小等..