一个空向量的开销是什么?

34

空 vector 和指向 vector 的指针相比,哪个的内存开销更大?

选项 A:

std::vector<int> v;

选项 B:

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

我认为选项B需要1个32位指针(这里假设是32位)

那么空的'v'占用多少内存?


希望知道您在这个问题中想要表达的意思。您是想创建一个它们的数组,并想知道将其作为指针数组时节省了多少空间吗?如果是这样,那么可能还有一些其他问题您需要知道。 - T.E.D.
6个回答

35

针对所提出的问题:这取决于实现。使用MSVC 7.1,这个:

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

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

然而应该注意到,指向向量的指针在非空情况下具有更大的开销:

  • 在所有情况下复杂度都更高
  • 在非空情况下时间和空间上都更高

@Legate:因为您需要将指针本身的大小加上向量的大小。 - Éric Malenfant
@ÉricMalenfant: 但是如果像问题的选项B一样初始化为 NULL,则不会构造向量,而使用选项A会默认构造一个向量。 - Christoph Wurm
6
@Legate:是的。这就是为什么我写了“在非空情况下”的原因。 - Éric Malenfant
@Michael Smith:一种实现可以选择存储大小并计算结束,或者反过来。重要的是它取决于具体的实现。 - Éric Malenfant
@Michael Smith:嗯,看起来是有的:https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/stl_vector.h。 - Éric Malenfant
显示剩余2条评论

13

这完全取决于具体实现,你既不应该假设也不应该依赖于细节。值得一提的是,在使用 VC 时它占用了20字节。


在GCC 4.6上,它是12个字节。我会假设指针占用4个字节,大小占用4个字节,容量占用4个字节。 - Joel

5

std::vector v; 占用 sizeof(v) 的空间。这可能因实现而异,因此运行它并找出它对于您占用了多少空间。


1
那么,向量内部使用的动态内存呢? - Diego Sevilla
1
一个默认构造的向量没有大小,也从来没有任何动态分配,因此它不应该有任何动态分配。 - Michael Burr

3
在 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字节。


3

VS2005:

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

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

谢谢!


0

具体实现取决于情况,可能需要一个指针和两个整数来表示当前大小和容量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接