2009-06-17 112 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,將其複製到矢量中並刪除該臨時對象實現的。