2012-12-14 95 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:你可能是對的;我已經刪除了這一說法。 –