首頁  >  文章  >  後端開發  >  在 C 向量中的「push_back」操作期間,複製建構函式被呼叫多少次?

在 C 向量中的「push_back」操作期間,複製建構函式被呼叫多少次?

Susan Sarandon
Susan Sarandon原創
2024-11-01 07:45:30749瀏覽

How Many Times Does the Copy Constructor Get Called During `push_back` Operations in a C   Vector?

了解Vector 的Push_back 複製行為

在使用向量時,開發人員經常會遇到有關Push_back 操作期間複製構造函數頻率的查詢。讓我們透過一個範例深入研究此行為:

考慮以下 C 程式碼:

<code class="cpp">class Myint {
  int my_int;
public:
  Myint() : my_int(0) {
    cout << "Inside default" << endl;
  }
  Myint(const Myint& x) : my_int(x.my_int) {
    cout << "Inside copy with my_int = " << x.my_int << endl;
  }
};

int main() {
  vector<Myint> myints;
  Myint x;
  myints.push_back(x);
  x.set(1);
  myints.push_back(x);
}</code>

此程式碼段預計會在 Push_back 操作期間觸發複製構造函數兩次。但是,執行後,我們觀察到以下輸出:

Inside default
Inside copy with my_int = 0
Inside copy with my_int = 0
Inside copy with my_int = 1

為什麼複製建構子似乎被呼叫了三次?

  • Push_back 插入:第一個push_back運算將x插入向量中,呼叫複製建構函式來初始化新建立的元素。
  • 向量重新分配:當第二個元素被push_back時,向量遇到它的容量限制並重新分配記憶體。由於 Myint 缺少隱式定義的移動建構函數,因此再次使用複製建構子。這次,它複製了第一個元素(my_int 仍為 0),然後複製了 x(my_int 更新為 1)。

因此,複製建構子總共被呼叫了 3 次。要最佳化此行為:

  • 提前預留記憶體:透過指定更高的向量容量,可以降低重新分配的可能性並最大限度地減少複製。
  • 使用 emplacement 取代 push_back: myints.emplace_back(0) 直接在向量中建構一個新元素,避免額外的副本。

以上是在 C 向量中的「push_back」操作期間,複製建構函式被呼叫多少次?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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