2015-03-31 146 views
2

考慮這種函數:我應該使用std :: move函數返回std :: vector嗎?

std::vector<int> generateVector() { 
    return std::vector<int>(10, 0); 
} 

是否有調用generateVector()這樣的任何好處:

std::vector<int> v = std::move(generateVector()); 

..或者是這種舉動的優化現在可以自動通過完成編譯器?

+0

問問你自己爲什麼叫_rvalue references_ !! – 2015-03-31 15:09:23

+0

好的,現在我已經問過自己了。正如Scott Meyers所說,你應該使用即使int x = std :: move(y)我也很困惑,所以這個問題。我沒有看到這些案件之間的區別。這不是一個重複的,完全不同的「可能重複」問題。 – user2061057 2015-03-31 15:29:35

+0

@ user2061057'或者這種移動優化現在是由編譯器自動完成的嗎?'。重複的答案表明:*所有的返回值已經被移動或者被優化了,所以不需要顯式地移動返回值。*這不是對你的問題的直接回答嗎?這不是重複的嗎? – Julian 2015-03-31 15:36:15

回答

8

既不:

  • 有沒有好處。

  • 除編譯C++外,編譯器沒有什麼特別之處。它可能會盡力做到這一點。

幸運的是,表達generateVector()已經是一個右值,所以v將與移動構造函數構造,但實際上你的v聲明和你的generateVector定義受複製省略,使建築可能被視爲等同於:

std::vector<int> v(10, 0); 

換句話說,語言規則明確允許拷貝構造函數不能在這種情況下被調用,即使他們有副作用。

+2

之前有過這個話題,我記得那時有人認爲使用std :: move會使代碼變得更糟,因爲copy elision比性能更好。 – BitTickler 2015-03-31 15:02:54

+2

@ user2225104:我認爲只提到了return語句。即'return std :: move(std :: vector (10,0));'會是一個嚴格的悲觀。 – 2015-03-31 15:09:33

6

std::move的目的是使右值變爲右值。在你的情況下,generateVector()已經是一個右值,所以它是多餘的。

+1

我**不會**說它是*「冗餘」*(這意味着它根本沒有效果,這可能是錯誤的)。我寧願說它可能會阻止某些優化,例如移動省略。所以它更好*如果你不寫'std :: move'。 – Nawaz 2015-03-31 15:06:48

5

返回對象的函數調用的結果已經是右值,因此應用std::move沒有任何好處。

事實上,它可能是一個悲觀:沒有std::move,變量是直接從臨時初始化,所以臨時(和移動)可以被消除。

相關問題