4

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

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

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

4

3 回答 3

12

看看来源。libstdc++是 gcc 下载的一部分。

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

  1. 一个数据指针,一个 4 个字节char*
  2. 元素计数或结束指针,asize_t或4 个字节char*
  3. 缓冲区大小或指向缓冲区结束的指针,对于 asize_t或4 个字节char*
  4. 标准分配器(空的普通类型)不需要空间,这要归功于一些实现技巧(空基类优化,可能还有部分模板专业化。C++20 可以使用该属性[[no_unique_address]])。

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

同样在理论上,2 和 3 可以与数据一起动态分配。虽然还没有发现有人真的这样做。

正如预期的那样,总共 12 个字节。
将 64 位实现的大小加倍。

于 2015-01-14T04:25:20.493 回答
4

通常 std::vector 有:

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

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

于 2015-01-14T04:29:22.617 回答
2

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()/调整大小等。

于 2015-01-14T04:29:56.407 回答