向量的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中文網其他相關文章!