考虑以下示例:
#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的副本?
答案 0 :(得分:3)
考虑到std::vector
有时会扩大它的分配区域(当你添加到许多元素时)并且必须将旧值复制到新位置。这会导致复制构造函数的调用。
您可以致电reserve()
std::vector<S> s;
s.reserve(20);
s.emplace_back();
s.emplace_back(6);
要说s
向量必须保留更大的内存区域以避免重新定位元素。
答案 1 :(得分:3)
这是因为@ max66解释了重新分配的原因。至于为什么它是被调用的复制构造函数,这是因为你的移动构造函数不是noexcept
。
更改为:
S(S &&) noexcept { puts("S&&"); }
然后它就是被调用的移动构造函数。