2012-12-14 61 views
3

如果我有一个类C++ vector emplace_back更快吗?

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

现在我有富的一个载体,我希望把这个载体向另一个载体

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

是否与这两条线的任何性能差异?

output.push_back(input[0]) 
output.emplace_back(input[0]) 
+0

检查http://stackoverflow.com/questions/4303513/push-back-vs-em-place-back – Kashyap

回答

9

是否与这两条线的任何性能差异?

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

emplace_back可以潜在地得到具有更多(或更少)比一个参数构建当一个好处:

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

emplace真正好处是没有表现那么多,但在允许不可复制(和在某些情况下不可移动)元素将在容器中创建。

+0

“任何体面的编译器都会在这两种情况下隐退并产生相同的代码” - 我不认为这是移动符合elision的条件。 'push_back(T &&)'将从临时引用已经被引用。 –

+0

@SteveJessop:你可能是对的;我已经删除了这一说法。 –