空矢量的大小

时间:2015-01-14 04:19:56

标签: c++ vector iterator sizeof g++4.8

以下使用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个字节到底是什么?

3 个答案:

答案 0 :(得分:9)

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

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

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

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

    同样在理论上,2和3可以与数据动态分配。但是没有发现任何人真的那么做。

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

答案 1 :(得分:3)

通常std :: vector有:

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

因此,在32位机器上,12号尺寸非常合理。

答案 2 :(得分:1)

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