保留容量会产生两次分配还是仅产生一次?

时间:2010-05-01 00:27:08

标签: c++ stl vector memory-management

std::vector<T> vec;   // line #1
vec.reserve(100);     // line #2

我想知道第1行是否会触发一个小分配(例如,内存为10 Ts),或者第一次分配是否发生在第2行。标准是否对此有所说明?

3 个答案:

答案 0 :(得分:7)

它是实现定义的。 vector的默认构造函数不需要分配任何内容,但允许实现执行此操作。

答案 1 :(得分:2)

标准没有说明,但你可以自己找出它在你的系统中的含义:

vector<int> v;
cout << v.capacity() << endl;
v.reserve(100);
cout << v.capacity() << endl;

这在VS2008上给了我0100 - 即初始向量没有分配。

编辑:删除了错误的建议 EDIT2:实验很少,因为我好奇......

vector<int> w;
for (int i=0; i<100000; i++)
{
    if (i == w.capacity())
        cout << i << ", ";
    w.push_back(i);
}

输出:

0, 1, 2, 3, 4, 6, 9, 13, 19, 28, 42, 63, 94, 141, 211, 316, 474, 711, 1066, 
1599, 2398, 3597, 5395, 8092, 12138, 18207, 27310, 40965, 61447, 92170,

答案 2 :(得分:0)

第一个通常不会触发分配,除了堆栈上的向量容器的空间(其中将包括有关已分配了多少空间以及使用了多少空间的信息,这两者都为零)。但是,在您保留之前,堆分配不会发生。通常...