2014-01-06 49 views
4

這些傳遞參數準則的指引斯特勞斯給出了他最新的C++的書 傳遞參數的函數:Stroustrup的在功能

[1] Use pass-by-value for small objects. 
[2] Use pass-by-const-reference to pass large values that you don’t need to modify. 
[3] Return a result as a return value rather than modifying an object through an argument. 
[4] Use rvalue references to implement move (§3.3.2, §17.5.2) and forwarding (§23.5.2.1). 
[5] Pass a pointer if ‘‘no object’’ is a valid alternative (and represent ‘‘no object’’ by nullptr). 
[6] Use pass-by-reference only if you have to. 

我的問題:

1)他沒有解釋他是指[1]中的「小物體」。該規則適用於內置的 類型,但我不確定用戶定義的類型。用戶定義的 類型必須以規則[1]傳遞的「小」是多少?

2)我認爲規則[3]只是一個風格問題。我錯了嗎?

3)我想知道爲什麼規則[6]。爲什麼Stroustrup討厭引用參數? :)(只是在開玩笑)

謝謝

+4

1)沒有「硬限制」;我的一般經驗法則是,大於128字節的東西不再「小」。 2)它允許進行某些優化,所以它不僅僅是風格。 3)你的代碼的副作用越小,通常它就是「更乾淨」。請注意,這些是準則,而不是硬性規定。 – Cornstalks

+0

@Cornstalks 1)爲什麼不直接通過const引用傳遞?並且只通過價值傳遞簡單的內置類型。 3)我現在看到阿哈。我幾年前就在使用Haskell,並且我確實意識到你說的,謝謝。 – user3111311

+3

@ user3111311:「爲什麼不只是通過const引用傳遞?」因爲這對小型類型來說效率較低 - 不僅僅是內置類型,而且對於小型,簡單複製類類型(對於一些依賴於上下文的「小」類型值)來說效率較低。 –

回答

3

小的尺寸會因上下文而異。請注意,規則(1)只是規則(2)的覆蓋 - 如果您的對象較小,請傳遞值而不是const&您不想修改它。請注意,在這種情況下,對象的大小更多地與複製它的成本有關,與sizeof的關係更小。一個1字節的對象在複製時複製兆字節的數據不是一個小對象。

返回而不是修改可以比修改引用嚴格更高效。各種不同的機制(包括NRVO和RVO)可能導致事情被直接構建。您的代碼還可以避免檢查輸入參數中的非空狀態並清除它們。

規則4和規則1可以相互作用:如果您要「傳送」您傳入的內容,即使對象很大,您應該經常在參數列表中執行副本,而不是在副本中功能。這與完成多個完美過載(在最壞的情況下有1個額外的移動)幾乎一樣有效,只要您的操作有效即可。