簡體   English   中英

多個emplace_back調用副本構造函數

[英]multiple emplace_back calling copy constructor additionally

考慮以下示例:

#include <iostream>
#include <vector>

class S {
public:
  S() { puts("S()"); }
  S(int) { puts("S(int)"); }
  ~S() { puts("~S()"); }
  S(const S &) { puts("S(const S&)"); }
  S(S &&) { puts("S&&"); }
  const S &operator=(const S &s) {
    puts("=");
    return s;
  }
  S &operator=(S &&s) {
    puts("Move =");
    return s;
  }
};

int main() {
  std::vector<S> s;
  s.emplace_back();
  s.emplace_back(6);
}

O / p:

S()
S(int)
S(const S&)
~S()
~S()
~S()

當只有一個元素為emplaced_backconstructor/destructor pair將被精確調用一次。 但是,當有多個emplace_back (例如s.emplace_back(6); )時,也會調用copy constructor 為什么這種行為有所不同? emplace_back是否仍然存在副本?

考慮到std::vector有時會擴大它的分配區域(當您添加到許多元素時),並且必須將舊值復制到新位置。 這導致復制構造函數的調用。

您可以致電reserve()

std::vector<S> s;
s.reserve(20);
s.emplace_back();
s.emplace_back(6);

s向量必須保留更大的存儲區域,以避免元素重定位。

這是因為如@ max66所述發生重新分配。 至於為什么要調用拷貝構造函數,這是因為您的move構造函數不是noexcept

更改為此:

S(S &&) noexcept { puts("S&&"); }

然后是move構造函數被調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM