STL矢量分配

时间:2009-06-17 15:00:04

标签: c++ stl

我想知道为什么矢量模板执行两个分配,只有一个似乎是 必要的。

例如:

#include <vector>
#include <iostream>

class A {
    public:
         A(const A &a) {
            std::cout << "Calling copy constructor " << this << " " << &a << "\n";
        }
         A() {
            std::cout << "Calling default constructor " << this << "\n";
        }
        ~A() {
            std::cout << "Calling destructor " << this << "\n"; 
        }
};

int main(int argc, char **argv)
{
    std::vector <A> Avec;

    std::cout << "resize start\n";
    Avec.resize(1);
    std::cout << "resize end\n";

    return 0;
}

输出:

resize start
Calling default constructor 0x7fff9a34191f
Calling copy constructor 0x1569010 0x7fff9a34191f
Calling destructor 0x7fff9a34191f
resize end

3 个答案:

答案 0 :(得分:15)

它没有执行两个分配,它是通过默认构造函数创建一个对象来传递给resize,然后将该对象复制到新位置,然后破坏参数。

如果你看一下调整大小的参数:

void resize(n, t = T())

它具有默认构造对象T(这是在输出中调用的默认构造函数)作为默认参数。然后,在函数内,它将其复制到正确的位置(这是复制构造函数)。调整大小函数结束后,销毁参数(输出中的析构函数调用)。

答案 1 :(得分:0)

如果初始化对象,则矢量模板通过制作副本来创建对象。 如果你不想调用复制构造函数,你应该:

vector<A*> Avec;
avec.push_back(new A());

http://www.cplusplus.com/reference/stl/vector/vector/

答案 2 :(得分:0)

这是一个猜测:

  1. 编译器重新排序Avec的初始分配,直到“调整大小开始”
  2. 之后
  3. 向量最初分配有0个元素
  4. 调整大小会使新元素填充默认A(通过创建默认A,将其复制到向量中并删除临时值来实现。