【问题标题】:What is the overhead cost of an empty vector?空向量的开销成本是多少?
【发布时间】:2010-10-08 03:56:33
【问题描述】:

拥有一个空向量与拥有一个指向向量的指针相比,内存开销是多少?

选项 A:

std::vector<int> v;

选项 B:

std::vector<int> *v = NULL;

我相信选项 B 需要 1 个 32 位指针(假设这里是 32 位) 空的 'v' 占用多少内存?

【问题讨论】:

  • 很高兴知道您想解决这个问题。您是否希望将它们组成一个数组,并想知道通过将其设为指针数组可以节省多少空间?如果是这样,您可能还应该了解其他一些问题。

标签: c++ memory stl vector overhead


【解决方案1】:

至于所问的问题:这取决于实施。使用 MSVC 7.1:

std:: cout << sizeof(std::vector<int>) << std::endl;

给我 16(字节)。 (3个指针:容量的开始、结束和结束,加上一个分配器)

不过需要注意的是,指向向量的指针给了它更大的开销:

  • 非空情况下的时间和空间
  • 在所有情况下都具有复杂性。

【讨论】:

  • @Legate:因为您必须将指针本身的大小添加到向量的大小
  • @ÉricMalenfant:但是如果初始化为NULL,就像问题的选项B一样,不会构造向量,而使用选项A会默认构造向量。
  • @Legate:是的。这就是为什么我写“在非空的情况下”
  • 不存储结束指针,而是在运行时计算:begin() + size().
  • @Michael Smith :实现可以选择存储大小并计算结束,反之亦然。重要的是它依赖于实现。
【解决方案2】:

它完全依赖于实现,你不应该假设也不依赖细节。值得的是,使用 VC 的 20 字节。

【讨论】:

  • 在 GCC 4.6 上,它是 12 个字节。我假设指针 4 个字节,大小 4 个字节,容量 4 个字节。
【解决方案3】:

std::vector v; 占用sizeof(v) 空间。它可能因实现而异,因此请运行它并找出它需要多少。

【讨论】:

  • 那么vector内部使用的动态内存呢?
  • 一个默认构造的向量没有大小并且从来没有,所以它应该没有动态分配。
【解决方案4】:

VS2005:

std::vector<int> *ptrToVec = new std::vector<int>();
std::vector<int> vecOfInt;

sizeof(ptrToVec) = 4
sizeof(vecOfInt) = 20

谢谢!

【讨论】:

    【解决方案5】:

    在 Visual Studio Community 2017(版本 15.2)中,运行以下代码:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void main()
    {
        vector<float> test;
        vector<float>* test2 = &test;
        cout << sizeof(test) << "\n";
        cout << sizeof(test2) << "\n";
    
        cout << "\n";
        system("pause");
    }
    

    以 32 位 (x86) 运行,我得到 16 个字节的向量和 4 个字节的向量指针。

    以 64 位 (x64) 运行,我得到 32 个字节的向量和 8 个字节的向量指针。

    【讨论】:

      【解决方案6】:

      依赖于实现,可能是一个指针和两个用于当前大小和容量的整数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-27
        • 2017-03-24
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 2011-11-23
        • 2017-09-27
        相关资源
        最近更新 更多