[翻譯] Effective C++, 3rd Edition, Item 20: 用 pass-by-reference-to-const(傳 const 引用)取代 pass-by-value(傳

來源:互聯網
上載者:User

(點擊此處,接上篇)

如如果你掀開編譯器的蓋頭偷看一下,你會發現 references(引用)一般是作為 pointers(指標)實現的,所以以 by reference(傳引用)方式傳遞某物實際上通常意味著傳遞一個 pointer(指標)。由此可以得出結論,如果你有一個 built-in typ(內建類型)的 object(例如,一個 int),以 by value(傳值)方式傳遞它常常比 by reference(傳引用)方式更高效。那麼,對於 built-in typ(內建類型),當你需要在 pass-by-value(傳值)和 pass-by-reference-to-const(傳 const 引用)之間做一個選擇時,沒有道理不選擇 pass-by-value(傳值)。同樣的建議也適用於 STL 中的 iterators(迭代器)和 function objects(函數對象),因為,作為慣例,它們就是為 passed by value(傳值)設計的。iterators(迭代器)和 function objects(函數對象)的實現有責任保證拷貝的高效並且不受切斷問題的影響。(這是一個“規則如何變化,依賴於你使用 C++ 的哪一個部分”的執行個體——參見 Item 1。)

built-in type(內建類型)很小,所以有人就斷定所有的小類型都是 pass-by-value(傳值)的上等候選者,即使它們是 user-defined(使用者定義)的。這樣的推理是不可靠的。僅僅因為一個 object 小,並不意味著調用它的 copy constructor(拷貝建構函式)就是廉價的。很多 objects ——大多數 STL containers(STL 容器)也在其中——容納的東西比指標多不了什麼,但是拷貝這樣的 objects 必須同時拷貝它們指向的每一樣東西。那可能是 very expensive(非常昂貴)的。

即使當一個小 objects 有廉價的 copy constructors(拷貝建構函式)時,也可能存在效能問題。一些編譯器對 built-in(內建)的和 user-defined types(使用者定義型別)並不一視同仁,即使他們有同樣的底層表示。例如,一些編譯器拒絕將僅由一個 double 組成的 objects 放入一個寄存器中,即使在常規上它們非常願意將純粹的 doubles 放入那裡。如果發生了這種事情,你以 by reference(傳引用)方式傳遞這樣的 objects 更好一些,因為編譯器理所當然會將一個指標(references(引用)的實現)放入寄存器。

小的 user-defined types(使用者定義型別)不一定是 pass-by-value(傳值)的上等候選者的另一個原因是:作為 user-defined(使用者定義)的,它的大小常常會變化。一個現在較小的類型在將來版本中可能變得較大,因為它的內部實現可能會變化。甚至當你換了一個不同的 C++ 實現時,事情都可能會變化。例如,就在我這樣寫的時候,一些標準庫的 string 類型的實現的大小就是另外一些實現的 seven times(七倍)。

通常情況下,你能合理地假設 pass-by-value(傳值)廉價的類型僅有 built-in types(內建類型)及 STL iterator(迭代器)和 function object(函數對象)類型。對其他任何類型,請遵循本 Item 的建議,並用 pass-by-reference-to-const(傳 const 引用)取代 pass-by-value(傳值)。

Things to Remember

  • 用 pass-by-reference-to-const(傳 const 引用)取代 pass-by-value(傳值)。典型情況下它更高效而且可以避免 slicing problem(切斷問題)。
  • 這條規則並不適用於 built-in types(內建類型)及 STL iterator(迭代器)和 function object(函數對象)類型。對於它們,pass-by-value(傳值)通常更合適。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.