[英]Why is copy constructor called in call to std::vector::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_back
, constructor/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.