空矢量的大小

问题描述 投票:1回答:3

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

c++ vector iterator sizeof g++4.8
3个回答
9
投票

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

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

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

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

理论上,2和3也可以与数据动态分配。虽然没有发现任何人真的这样做。

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


3
投票

通常std :: vector具有:

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

所以尺寸12在32位机器上非常合理。


1
投票

libstdc ++的std::vector派生自一个具有此类数据成员的base:

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

_M_end_of_storage支持.capacity() / resizing等。

© www.soinside.com 2019 - 2024. All rights reserved.