2010-01-21 88 views

回答

15

更喜歡傳遞原始類型(int,char,float,...)和便宜的複製(點,複雜)值的POD結構。

這比通過引用傳遞所需的間接方式更高效。

請參閱Boost's Call Traits

模板類call_traits<T>封裝了「最好」的方法的一些類型T的參數傳遞到或從一個函數,並且由被定義爲如下表的typedef的集合。 call_traits的目的是確保像「引用引用」這樣的問題永遠不會發生,並且參數以最有效的方式傳遞。

4

是的,訪問通過引用參數傳遞可能需要比傳遞值參數更多的間接級別。此外,如果參數的大小小於單個指針的大小,則可能會變慢。當然,這都是假設編譯器沒有優化它。

+0

那麼如何才能找出他的編譯器是否正在優化呢? – Arthur 2012-11-14 15:53:10

+2

通過查看二進制代碼 – 2012-11-14 21:32:04

7

您可以閱讀這篇文章"Want speed ? Pass by value"關於copy elision和RVO(按價值優化返回)。它解釋了引用有時會阻止編譯器執行它們。

1

如果類型的大小相同或小於引用/指針的大小,編譯器可以通過引用簡單地傳遞值來優化傳遞基元類型。不能保證編譯器會這樣做,所以如果你有選擇,按值傳遞原始類型。儘管如此,在模板化的代碼中,你通常必須通過引用傳遞 - 考慮使用const引用的vector的push_back。如果你有一個int整數,你會傳遞一個基本類型的引用。在這種情況下,您希望編譯器通過用參數替換參考值來優化該參數。由於矢量雖然可以存儲大量類型,但接受常量引用是最好的選擇。

+0

「編譯器可以優化...」,只要被調用者不修改referand或在調用任何可能修改它的代碼後讀取它。但是,當然,如果是這樣的話,你希望不會問「哪個更昂貴」的問題,而是「哪個是正確的」:-)尷尬的是你認爲編譯器可以優化的情況,但實際上它不能,因爲你忽略了某些原因它必須是一個參考(別名規則是驚喜的主要原因)。 – 2010-01-21 15:34:46