據我所知,你不應該在C++中通過引用傳遞簡單的類型,因爲它不會提高性能,它甚至對性能(?)不利。至少這就是我從網上收集的信息。不通過引用傳遞簡單類型的原因?
但我不能找出原因爲什麼它是壞的表現,是不是因爲它是對C更快++只創建一個新的簡單類型比它實在是太擡頭變量或者是什麼呢?
據我所知,你不應該在C++中通過引用傳遞簡單的類型,因爲它不會提高性能,它甚至對性能(?)不利。至少這就是我從網上收集的信息。不通過引用傳遞簡單類型的原因?
但我不能找出原因爲什麼它是壞的表現,是不是因爲它是對C更快++只創建一個新的簡單類型比它實在是太擡頭變量或者是什麼呢?
如果創建一個參考,它是:
pointer to memory location -> memory location
如果您使用的值,它是:
memory location
由於價值已經被複制任何一種方式(參照值或值) ,通過引用並不會提高性能;必須進行一次額外的查找。所以它理論上會「惡化」表現,但不是你會注意到的。
這是一個誤導性答案。 _「由於值必須以任一方式複製」_。通過ref傳遞不會導致複製值,而是在同一個對象上使用指針操作。所以傳遞'double'就意味着創建一個'double'的副本(如果它是一個左值)並在該函數中使用該副本。傳遞引用意味着您將指針傳遞給函數並執行解引用,無論何時使用該值,但不將該var放入堆棧。如果你有一個引用另一個具有值arg的引用的函數,那麼只有第二個將在棧上分配var。 –
@AdamHunyadi:通過引用傳遞結果會複製一個指針(直至優化)。這就是我所說的「價值」。 (您可以通過閱讀引用部分後面的括號來判斷。) – Ryan
內部引用在指針中處理,每次訪問它們時都需要取消引用。這顯然需要額外的操作。
引用不是指針。你也不應該將引用看作指針(它只是讓他們更難以思考)。 –
我可以同意在本地範圍內創建的引用,但是將東西傳遞給方法作爲參考怎麼辦?如果你不通過值傳遞(閱讀:把一個副本放在堆棧上),你唯一的選擇就是傳遞一個指向被引用對象的指針。你必須通過堆棧或寄存器來傳遞某些東西,所以它必須是整個值或是一個指向它的指針。由於引用顯然不是整個值,它們必須是指針。我更喜歡用C#和Java的「簡單工作」方式來思考它們,但在內部它們像自動解引用的指針一樣工作。 – Wormbo
您現在將語言結構(指針/引用)映射到實現細節。這甚至沒有用處。 –
例如,在32位模式下,int
大小是4字節,而int *
指針大小是4字節。 直接傳遞4個字節int
比傳遞4個字節指針更快,然後通過該指針加載int
。
@Loki Astari:某些配置中的參數總是從內存中加載(它應該是指針還是值),但是如果它是指針,那麼內存中會有另一個加載,這並不適用於將值本身作爲參數傳遞的情況。 – Ruben
這是一個很好的問題,而且你問的事實表明你正在關注你的代碼。然而,好消息是,在這種特殊情況下,有一個簡單的方法。
這由Dave Abrahms優秀的文章回答你所有的問題,然後一些:Want Speed? Pass by Value.
老實說,它不會做鏈接正義來概括它,它是一個真正的必讀。但是,簡而言之,您的編譯器足夠聰明,可以正確執行,如果您嘗試手動執行,則可能會阻止編譯器進行某些優化。
即使沒有任何「性能」考慮因素,引用參數也會改變調用語義...... – 2012-05-26 23:07:09
如果通過常量引用傳遞(編譯器會將其轉換爲按值傳遞),我認爲這是編譯器優化。 –