我對值調用和const調用引用之間的差異有點困惑。有人可以向我解釋這一點。例如,它們是否都可以防止更改調用者參數,它們對於所有對象大小都是快速的,在複製過程中複製參數還是在複製時使用更多內存?通過值調用vs const通過參考調用
回答
主要區別在於,傳遞const
引用(或非const)不會生成參數的副本。 (副本實際上受限於副本,但理論上它是通過值傳遞給函數的副本)
在某些情況下,傳遞值的速度一樣快,甚至更快(通常當對象最多隻有一個寄存器的大小)。您通常會按值傳遞基本類型,並通過引用傳遞類類型。
當const
參考你仍然可以僅僅通過鑄造常量遠離(通過const_cast
)修改原來的值傳遞,但在不確定的行爲,如果原來的值是const
。
做他們既保護反對改變求助者參數
按值傳遞創建副本調用者提供的說法,所以無論怎樣的功能呢,它是在一個單獨的對象。這意味着原始對象不會被觸摸,所以在這種情況下,答案是「是」。
傳遞參照const
,在另一方面,讓功能是指相同的對象,調用者提供的,但它不會讓這種功能修改... 除非(如正確地Luchian評論格里戈裏在評論)函數的實現者使用const_cast<>
從參考,這是一件好事,可如果知道綁定到參考對象是被安全地只是做丟掉const
-ness 不宣佈爲的const
類型(否則,您將獲得未定義行爲)。
因爲這似乎不是最有可能的情況考慮你的問題,並考慮到一般收受const
參考代表承諾該參數將不被感動,那麼答案是,只要因爲我們承擔履行這一承諾,通過引用傳遞到const
不會改變調用者提供的參數。因此,答案是「是」了 - 與小警告我上面提到的。
是他們的快速所有對象大小
號雖然你應該首先定義 「快」。如果所傳遞的對象的類型是複製昂貴(或移動,如果進行移動,而不是複製),然後按值傳遞可能很慢。按引用傳遞總是會花費你相同的(地址的大小),不管是要傳遞值的類型。
請注意,在某些體系結構和某些數據類型(如char
)中傳遞值可能比傳遞引用更快,而對於足夠大的UDT通常情況正好相反。
哪些在複印時使用更多內存?
由於只有其中一個造成副本,所以問題有一個明顯的答案。
通過值調用將複製對象的所有元素,它保護調用者參數,因爲如果您要更改某些內容,它只是您正在更改的副本。
由const引用調用不會複製元素,但由於「const」它將保護調用者的參數。
你const引用。
我想你指的區別:
void Fn1(MyType x);
和
void Fn2(const MyType& x);
在前者的情況下,該對象的副本總是產生,這使得它更慢,特別是如果該類型有一個非平凡的構造函數。原始對象不會受到函數內副本所做的任何更改的影響,但副本本身可以更改。
後一個例子不會創建副本,一般來說會更快。在函數內部,只有const函數可以在參數上調用(除非你使用類似強制轉換的骯髒技巧),從而保證對象不會被修改。
重要提示:本討論不包含具有特殊語義的類型,如智能指針。在這種情況下,按值調用仍然允許您更改邏輯上相同的對象,即不是智能ptr實例本身,而是它指向的對象。
所以這裏的問題的答案:
- 做他們都反對改變求助者的說法保護:是的,原來的對象將保持不變(不包括技巧)
- 是他們的快速所有對象大小:它們不是同樣快 - 除了一些原始類型,速度幾乎相同或甚至稍微更快,取決於編譯器優化,引用調用通常更快。
- 要麼複製的參數,而是一個doesnt:按值調用創建副本,通過引用調用不
- 其中複製時使用更多的內存?通過引用的調用不會創建副本,因此答案很明確
- 1. 通過參考在JavaScript(調用方法)
- 2. 再通過參考
- 3. LLVM,通過參考
- 4. C - 通過參考?
- 5. 調用通過PHP
- 6. 調用通過SDK
- 7. 通過值認爲參數是const
- 8. C++通過Const引用並通過Const返回引用
- 9. C++ - 通過派生參考調用基礎實現?
- 10. 通過RealProxy參考參數
- 11. 通過getModel調用函數與通過對象直接調用
- 12. 通過引用,值和名稱調用
- 13. 如何通過MSBuild參數調用MSBuild.ExtensionPack?
- 14. 通過調用URL傳遞JavaScript參數
- 15. php函數調用參數不通過
- 16. Sencha通過參數調用路由
- 17. 不通過參數調用的方法
- 18. MVC ajax調用不通過參數
- 19. 通過引用傳遞const值的C++
- 20. 實現在Python回調 - 通過一個可調用的參考電流功能
- 21. 通過類的const引用
- 22. 通過XML在Flash中通過Youtube.com調用視頻通過XML
- 23. 只通過Ajax調用調用動作
- 24. 通過參考值不工作在java
- 25. 通過參考類型按值
- 26. 晶體通過參考或值變量
- 27. 最好是通過參考值
- 28. 通過調用Ajax設置struts bean值
- 29. javascript調用不通過正確的值
- 30. 通過代理通過發送調用靜態通用方法
'const_cast'怎麼樣? – 2013-03-11 22:43:00
@LuchianGrigore:從技術上講,你的評論是正確的。然而,我將OP的問題解釋爲「*我應該(函數的創建者)對不需要改變其參數值的函數使用傳遞值或傳遞參數給'const' *「?也許我誤解了。將編輯我的答案並澄清,謝謝。 – 2013-03-11 22:45:35