2010-04-27 107 views
0

IDE再分配 - Visual Studio 2008中時,Visual C++矢量確實每個的push_back

  1. 我有一個自定義類的Class1用拷貝構造函數給它。
  2. 我也有一個矢量
  3. 數據插入使用下面的代碼
Class1* objClass1; 
vector<Class1> vClass1; 

for(int i=0;i<1000;i++) { 

    objClass1 = new Class1(); 
    vClass1.push_back(*objClass1); 
    delete objClass1; 

}

現在在每次插入,向量被重新分配和所有現有的內容都被複制到新的位置。例如,如果向量有5個元素,如果我插入第6之一,隨着新一個沿前5個元素被複制到新的位置(我想通了由複製構造函數添加日誌語句。)

使用儲備(),然而,這並不如預期發生!我有以下問題

  1. 是否必須始終使用保留語句?
  2. 矢量是否做了重新分配每次我做一個的push_back時間;或者它發生,因爲我調試
+1

在一個不相關的音符,它會更容易,更有效,只是'vClass1.push_back(1類());',沒有任何的堆內存分配。 – doublep 2010-04-27 20:01:50

回答

1

找出把你的拷貝構造函數測試到非調試代碼,並讓我們知道你會得到什麼你平臺!海事組織矢量不應該在每次推遲時重新分配。有更聰明的方法來管理內存,我敢打賭,實施者沒有這樣做。

2
  1. 這不是強制性的,這是一個優化,因爲重新分配是昂貴的。
  2. 我認爲這是一個實現細節是不是經常重新分配。我認爲向量在每次重新分配時加倍存儲是正常的,但正如我所說的,這可能因實現而有所不同。 (這可能是因爲你在調試版本它重新分配往往比正常的情況。)
+0

@ jwismar:不,他的記憶處理很好。 Vector將包含'* objClass1'的*副本*,因此刪除原始文件是完全合法的。 – doublep 2010-04-27 19:54:19