2009-06-17 68 views
3

我想知道为什么矢量模板执行两个分配,当只有一个似乎是 必要的。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 

回答

15

它不执行两个分配,它是通过创建默认构造函数的对象传递到调整大小,然后将该对象复制到新位置,然后破坏该参数。

如果你看看参数调整:T型的

void resize(n, t = T()) 

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

0

如果初始化方式矢量模板通过复印创建对象的对象。 如果你不想调用拷贝构造函数,你应该:

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

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

+0

我认为这将会产生两个分配: - 一个用于新的A() - 一个用于push_back()的副本 – ynimous 2009-06-17 15:14:43

0

这里有一个猜测:

  1. 编译器重新排序的Avec的初始分配,直到“调整开始”
  2. 矢量最初与0元素
  3. 容量调整得到分配后新元素填充了默认的A(这是通过创建默认A,将其复制到矢量中并删除该临时对象实现的。