有沒有在C++中通過引用比通過值更昂貴的情況?如果是這樣,那麼情況會是怎樣?通過引用通過比價值傳遞更昂貴
回答
更喜歡傳遞原始類型(int,char,float,...)和便宜的複製(點,複雜)值的POD結構。
這比通過引用傳遞所需的間接方式更高效。
模板類
call_traits<T>
封裝了「最好」的方法的一些類型T的參數傳遞到或從一個函數,並且由被定義爲如下表的typedef的集合。call_traits
的目的是確保像「引用引用」這樣的問題永遠不會發生,並且參數以最有效的方式傳遞。
是的,訪問通過引用參數傳遞可能需要比傳遞值參數更多的間接級別。此外,如果參數的大小小於單個指針的大小,則可能會變慢。當然,這都是假設編譯器沒有優化它。
您可以閱讀這篇文章"Want speed ? Pass by value"關於copy elision和RVO(按價值優化返回)。它解釋了引用有時會阻止編譯器執行它們。
如果類型的大小相同或小於引用/指針的大小,編譯器可以通過引用簡單地傳遞值來優化傳遞基元類型。不能保證編譯器會這樣做,所以如果你有選擇,按值傳遞原始類型。儘管如此,在模板化的代碼中,你通常必須通過引用傳遞 - 考慮使用const引用的vector的push_back。如果你有一個int整數,你會傳遞一個基本類型的引用。在這種情況下,您希望編譯器通過用參數替換參考值來優化該參數。由於矢量雖然可以存儲大量類型,但接受常量引用是最好的選擇。
「編譯器可以優化...」,只要被調用者不修改referand或在調用任何可能修改它的代碼後讀取它。但是,當然,如果是這樣的話,你希望不會問「哪個更昂貴」的問題,而是「哪個是正確的」:-)尷尬的是你認爲編譯器可以優化的情況,但實際上它不能,因爲你忽略了某些原因它必須是一個參考(別名規則是驚喜的主要原因)。 – 2010-01-21 15:34:46
- 1. 通過值比傳遞通過更快
- 2. 通過傳遞價值
- 3. 爲什麼移動比通過const&?更加昂貴?
- 4. 通過引用傳遞與值傳遞
- 5. Java是通過值傳遞還是通過引用傳遞?
- 6. 通過模板傳遞價值
- 7. SurfaceHolder.lockCanvas()過於昂貴
- 8. 通過引用傳遞C++
- 9. C++通過引用傳遞?
- 10. cpp通過引用傳遞
- 11. PHP通過引用傳遞?
- 12. Java通過引用傳遞
- 13. C++通過引用傳遞
- 14. 通過引用傳遞流
- 15. JFrame通過引用傳遞
- 16. 通過引用傳遞LPCWSTR
- 17. Java通過引用傳遞
- 18. 通過引用傳遞const值的C++
- 19. 通過引用傳遞值類型
- 20. 在perl中通過引用傳遞值
- 21. JavaScript通過引用或值傳遞?
- 22. Java按值或通過引用傳遞?
- 23. 通過引用或值傳遞對象
- 24. PHP通過引用傳遞/值 - 問題
- 25. 通過值或引用傳遞http.ResponseWriter?
- 26. RCPP通過引用傳遞與按值
- 27. 防止通過引用傳遞右值
- 28. 無法通過引用C++傳遞值
- 29. 在C++上通過引用傳遞值
- 30. Delphi:通過引用或傳遞值?
那麼如何才能找出他的編譯器是否正在優化呢? – Arthur 2012-11-14 15:53:10
通過查看二進制代碼 – 2012-11-14 21:32:04