C++中,使用vector的emplace_back方法会更快吗?

5

如果我有一个类

class foo {
 public:
  foo() { // spend some time and do something. }
 private:
   // some data here
}

现在我有一个 foo 的向量,我想将这个向量放入另一个向量中。

vector<foo> input; // assume it has 5 elements
vector<foo> output;

这两行代码有性能差异吗?
output.push_back(input[0])
output.emplace_back(input[0])

1
请查看https://dev59.com/E2855IYBdhLWcg3wg0nC - Kashyap
1个回答

12

这两行代码有任何性能差异吗?

没有,两者都将使用复制构造函数来初始化新元素。

emplace_back 在构造时使用一个以上(或少于一个)参数时可能会带来好处:

output.push_back(foo{bar, wibble}); // Constructs and moves a temporary
output.emplace_back(bar, wibble);   // Initialises directly

emplace 的真正好处不在于性能,而在于允许在容器中创建非可复制(在某些情况下为不可移动)的元素。


任何好的编译器都将省略移动操作并在两种情况下生成相同的代码 - 我认为这个移动操作不符合省略条件。push_back(T&&)会从已经被引用的临时对象中移动。 - Steve Jessop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接