gpt4 book ai didi

c++ - 多个 emplace_back 额外调用复制构造函数

转载 作者:行者123 更新时间:2023-11-30 00:44:16 26 4
gpt4 key购买 nike

考虑下面的例子:

#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 vector 必须保留更大的内存区域以避免元素的重定位。

关于c++ - 多个 emplace_back 额外调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49497240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com