【问题标题】:Size of empty vector空向量的大小
【发布时间】:2015-01-14 04:19:55
【问题描述】:

使用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 个字节是什么意思?

【问题讨论】:

  • 在我的系统上它是 32 字节(开始、大小、容量、分配器,加上与迭代器范围检查相关的四个值)
  • @MattMcNabb:请您详细说明一下?
  • 这就是我所知道的。一个已失效。

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    通常 std::vector 有:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-11-13
        • 1970-01-01
        • 2023-04-02
        • 2018-05-02
        • 2012-06-23
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多