空矢量的大小

cri*_*ron 1 c++ iterator vector sizeof g++4.8

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

vector<char> v;
cout << sizeof(v) << endl;
Run Code Online (Sandbox Code Playgroud)

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

Ded*_*tor 9

看看消息来源.libstdc++是gcc下载的一部分.

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

  1. 一个数据指针,一个4字节char*.
  2. 元素计数或结束指针,a size_t或4个字节char*.
  3. 缓冲区大小或指向缓冲区结尾的指针,4个字节用于size_tchar*.
  4. 由于一些实现技巧(Empty-baseclass-optimization,也许是部分模板专用化),标准分配器(空的普通类型)不需要空间.C++ 20可以使用该属性[[no_unique_address]]代替.

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

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


Gya*_*ain 5

通常 std::vector 具有:

1. Start of allocation / begin
2. End of vector (begin + size)
3. End of allocation (begin + capacity)
Run Code Online (Sandbox Code Playgroud)

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