2011-11-23 63 views

回答

8

foo()返回不能被綁定到非const引用臨時對象。

執行下列操作之一:

//temporary can be bound to const-reference, so this is ok 
const std::vector<int> &f = foo(); //no copy takes place. 

//or save a copy of temporary 
std::vector<int> f = foo(); //copy takes place (may be optimized by compiler) 

閱讀上述評論。在第二個版本(非參考版本)中,編譯器可以優化返回值,避免臨時複製。這也取決於foo()的實施。

看到這個:

+0

對於這些示例,複製是否仍然發生? – pingu

+0

@pingu:閱讀評論。 – Nawaz

+0

@pingu - 編譯器很有可能但不保證優化第二版本的副本 - 請參閱http://en.wikipedia.org/wiki/Return_value_optimization)。 –

2

你的代碼是不合法的。它應該是:

std::vector<int> const& f = foo(); 

std::vector<int> f = foo(); 

該標準允許在兩種情況下複印件(至少C++ 03做—我 認爲C++ 11個地張緊東西在第一案件);它不需要它在 中,我也不知道哪種編譯器實際上在 中都有副本。如果你真的擔心的副本,不過,改變 申報foo到:

void foo(std::vector<int>& results); 

和使用:

std::vector<int> f; 
foo(f); 

保證不會有副本,任何地方。這不太好, 但如果分析表明複製是一個瓶頸在這裏,它應該是 考慮。

+0

謝謝詹姆斯,我是否正確地說,唯一的另一種避免複製的選擇是使用智能指針? – pingu

+0

根據函數的內部情況,C++ 03 compiers可能無法使用RVO。我聽說過許多編譯器偶然發現了像http://codepad.org/n88KlNFc –

+0

@pingu這樣的東西:你也可以通過引用該函數來傳遞一個向量,以便將返回值放入。 –

相關問題