首頁  >  文章  >  後端開發  >  為什麼「vector::push_back」呼叫複製建構子的次數似乎超出預期?

為什麼「vector::push_back」呼叫複製建構子的次數似乎超出預期?

Linda Hamilton
Linda Hamilton原創
2024-10-31 22:56:28471瀏覽

Why Does `vector::push_back` Seem to Call the Copy Constructor More Than Expected?

向量的push_back:揭示隱藏的複製構造函數呼叫

在一個令人困惑的場景中,向量的push_back方法似乎調用了複製構造函數比預期的次數多。為了研究這種行為,讓我們深入了解具體細節。

考慮提供的程式碼片段:

<code class="cpp">class Myint
{
    //...
};

vector<Myint> myints;
Myint x;

myints.push_back(x);
x.set(1);
myints.push_back(x);</code>

最初,x 被推入向量中。正如預期的那樣,在初始化期間發生一份副本。但在檢查輸出後,我們發現複製建構函式被呼叫了三次,而不是預期的兩次。是什麼導致了這種差異?

向量的內在行為開始發揮作用。當向量用完空間時,它必須重新分配記憶體。在我們的例子中,第二個push_back觸發重新分配。由於沒有為 Myint 隱式定義移動建構函數,因此使用複製建構子。因此,第一個元素被複製到新分配的記憶體中,然後是 x 的第二個副本。此附加副本解釋了複製構造函數的第三次調用,其中 x 將 my_int 設為 1。

因此,總共發生了三次複製建構函式呼叫。這個數字可能會根據實現和初始向量容量而有所不同,但至少兩次調用。

為了緩解這個問題,請考慮使用reserve方法提前保留更多記憶體。這確保了足夠的容量,避免不必要的重新分配:

<code class="cpp">myints.reserve(2); // Allows two insertions without reallocation</code>

此外,可以使用emplace_back 方法來刪除副本:

<code class="cpp">myints.emplace_back(0); // Creates a new element directly in the vector</code>

emplace_back 將任意參數轉發給構造函數,繞過副本或移動。

以上是為什麼「vector::push_back」呼叫複製建構子的次數似乎超出預期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn