2013-03-11 89 views
1

我對值調用和const調用引用之間的差異有點困惑。有人可以向我解釋這一點。例如,它們是否都可以防止更改調用者參數,它們對於所有對象大小都是快速的,在複製過程中複製參數還是在複製時使用更多內存?通過值調用vs const通過參考調用

回答

0

主要區別在於,傳遞const引用(或非const)不會生成參數的副本。 (副本實際上受限於副本,但理論上它是通過值傳遞給函數的副本)

在某些情況下,傳遞值的速度一樣快,甚至更快(通常當對象最多隻有一個寄存器的大小)。您通常會按值傳遞基本類型,並通過引用傳遞類類型。

const參考你仍然可以僅僅通過鑄造常量遠離(通過const_cast)修改原來的值傳遞,但在不確定的行爲,如果原來的值是const

6

做他們既保護反對改變求助者參數

按值傳遞創建副本調用者提供的說法,所以無論怎樣的功能呢,它是在一個單獨的對象。這意味着原始對象不會被觸摸,所以在這種情況下,答案是「」。

傳遞參照const,在另一方面,讓功能是指相同的對象,調用者提供的,但它不會讓這種功能修改... 除非(如正確地Luchian評論格里戈裏在評論)函數的實現者使用const_cast<>從參考,這是一件好事,可如果知道綁定到參考對象是被安全地只是做丟掉const -ness 宣佈爲的const類型(否則,您將獲得未定義行爲)。

因爲這似乎不是最有可能的情況考慮你的問題,並考慮到一般收受const參考代表承諾該參數將不被感動,那麼答案是,只要因爲我們承擔履行這一承諾,通過引用傳遞到const不會改變調用者提供的參數。因此,答案是「」了 - 與小警告我上面提到的。

是他們的快速所有對象大小

雖然你應該首先定義 「快」。如果所傳遞的對象的類型是複製昂貴(或移動,如果進行移動,而不是複製),然後按值傳遞可能很慢。按引用傳遞總是會花費你相同的(地址的大小),不管是要傳遞值的類型。

請注意,在某些體系結構和某些數據類型(如char)中傳遞值可能比傳遞引用更快,而對於足夠大的UDT通常情況正好相反。

哪些在複印時使用更多內存?

由於只有其中一個造成副本,所以問題有一個明顯的答案。

+0

'const_cast'怎麼樣? – 2013-03-11 22:43:00

+0

@LuchianGrigore:從技術上講,你的評論是正確的。然而,我將OP的問題解釋爲「*我應該(函數的創建者)對不需要改變其參數值的函數使用傳遞值或傳遞參數給'const' *「?也許我誤解了。將編輯我的答案並澄清,謝謝。 – 2013-03-11 22:45:35

0

通過值調用將複製對象的所有元素,它保護調用者參數,因爲如果您要更改某些內容,它只是您正在更改的副本。
由const引用調用不會複製元素,但由於「const」它將保護調用者的參數。

你const引用。

0

我想你指的區別:

void Fn1(MyType x); 

void Fn2(const MyType& x); 

在前者的情況下,該對象的副本總是產生,這使得它更慢,特別是如果該類型有一個非平凡的構造函數。原始對象不會受到函數內副本所做的任何更改的影響,但副本本身可以更改。

後一個例子不會創建副本,一般來說會更快。在函數內部,只有const函數可以在參數上調用(除非你使用類似強制轉換的骯髒技巧),從而保證對象不會被修改。

重要提示:本討論不包含具有特殊語義的類型,如智能指針。在這種情況下,按值調用仍然允許您更改邏輯上相同的對象,即不是智能ptr實例本身,而是它指向的對象。

所以這裏的問題的答案:

  • 做他們都反對改變求助者的說法保護:是的,原來的對象將保持不變(不包括技巧)
  • 是他們的快速所有對象大小:它們不是同樣快 - 除了一些原始類型,速度幾乎相同或甚至稍微更快,取決於編譯器優化,引用調用通常更快。
  • 要麼複製的參數,而是一個doesnt:按值調用創建副本,通過引用調用不
  • 其中複製時使用更多的內存?通過引用的調用不會創建副本,因此答案很明確