回答
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()
的實施。
看到這個:
你的代碼是不合法的。它應該是:
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);
保證不會有副本,任何地方。這不太好, 但如果分析表明複製是一個瓶頸在這裏,它應該是 考慮。
謝謝詹姆斯,我是否正確地說,唯一的另一種避免複製的選擇是使用智能指針? – pingu
根據函數的內部情況,C++ 03 compiers可能無法使用RVO。我聽說過許多編譯器偶然發現了像http://codepad.org/n88KlNFc –
@pingu這樣的東西:你也可以通過引用該函數來傳遞一個向量,以便將返回值放入。 –
- 1. 返回引用類型的方法返回引用還是克隆副本?
- 2. 指定返回類型
- 3. 引用返回結構/派生類型
- 4. 未指定類型的返回類型
- 5. 將表單類型傳遞給方法返回空引用?
- 6. 將const引用返回給本地對象時發生了什麼?
- 7. 類中的C++方法定義是否必須指定返回類型?
- 8. 如何將指針數組的返回類型指定爲void?
- 9. JavaScript shift()方法返回元素的引用還是副本?
- 10. 雖然返回類型(&值)指定
- 11. PyCharm:指定返回變量的類型?
- 12. Convert.ChangeType()是否創建對象的副本或返回原始對象的引用?
- 13. 每個循環的Java是否返回引用或參考副本?
- 14. 是否從unique_ptr返回引用有時會創建其對象的副本?
- 15. MOQ測試返回給定類型
- 16. 將本地CStringW返回給調用者是否安全?
- 17. 你是否總是需要在函數中指定返回值的類型?
- 18. 將指向字符串的指針返回給調用者是否安全?
- 19. 是否完全可以將一個裸指針返回給某個類的unique_ptr
- 20. 當未返回未定義對象類型的引用的C++函數的返回值時,會發生什麼?
- 21. 返回類型從給定的類提供的類型
- 22. System.Void類型如何爲不返回值的方法指定返回值類型?
- 23. 指定副本指針
- 24. 如何返回指定返回值的子類型(在本例中爲interface {})?
- 25. 是否可以在Scala中指定一個匿名函數的返回類型?
- 26. 返回引用一個const指針爲const類型
- 27. 將const引用返回給字符串
- 28. 如何確定給定數組類型的下標運算符的返回類型是否帶有boost?
- 29. 從基類中調用GetType()是否返回派生類型最多?
- 30. 將C#引用類型克隆到派生引用類型
對於這些示例,複製是否仍然發生? – pingu
@pingu:閱讀評論。 – Nawaz
@pingu - 編譯器很有可能但不保證優化第二版本的副本 - 請參閱http://en.wikipedia.org/wiki/Return_value_optimization)。 –