2010-11-06 57 views
9

可能重複:
How to pass objects to functions in C++?
is there any specific case where pass-by-value is preferred over pass-by-const-reference in C++?傳遞值或通過引用獲取基本數據類型會更好嗎?

我有這樣實現的類的成員:

void aaa(int a, float b, short c) 
{ 
    bbb(a, b); 
} 

void bbb(int a, float b) 
{} 

如果a的值,B和C作爲常量存儲在我的課堂中,那麼使用它會更好/明智我的功能如下所示或如上所示?

void aaa(int& a, float& b, short& c) 
void bbb(int& a, float& b) 

在這種情況下,使用參考文獻是否給出了速度優勢或優勢?這裏的引用有什麼缺點/開銷?

+1

好的,那些'*'是關於什麼的?! – 2010-11-06 11:35:19

+0

我想你需要編輯格式int **&**沒有意義:-) – 2010-11-06 11:35:51

+0

asterixes是由StackOverflow添加的。該網站應該將星號之間的字母轉換爲粗體。將刪除它因爲它不轉換。 – Nav 2010-11-06 11:42:36

回答

4

標準對引用的實現沒有約束,但通常它們被實現爲自動引用指針(實際上有一些例外)。正如你可能知道的,在32位系統指針大小是4字節,這意味着通過引用傳遞字符,shorts(sizeof()小於4字節的類型)可能被認爲有點過度使用 - 使用4個字節而不是1(char)或2(短)。 一般情況下,它取決於rigisters或stack是否用於傳遞參數:當按值傳遞基本類型時,可以保存一點堆棧,但如果寄存器甚至包含chars,則將使用4個字節,所以沒有意義試圖用ptrs/refs來優化某些內容。

+0

請注意,性能還有另外一個區別:直接使用int時,該值存在於寄存器或堆棧中,而在傳遞引用時(假設爲自動解除引用的指針),實際值必須用額外的間接,如果按價值傳遞,這將是不必要的。 – 2010-11-06 11:54:41

+0

-1傳播關於堆棧使用的誤解。在堆棧上傳遞'char',通常在32位系統上使用4個字節的堆棧空間。在C和C++中,相同的基本原因反映在自動升級到int中。總之,堆棧空間的使用與小型類型無關。相反,它與編程時間,編寫需要多少以及需要閱讀多少(即編程效率)有關,它與可能的額外間接性(即程序效率)有關。 – 2010-11-06 12:44:03

+0

呃,誰再投這個不正確的答案? – 2010-11-06 13:09:17

3

如果你使用的引用,使它們const

void bbb(const int & a, const float & b); 

否則語義將是按值傳遞不同,因爲函數可以改變傳遞給參數變量的值。這意味着你不能使用文字作爲參數。

1

我看不出它會更快的原因。在這兩種情況下,您都需要將參數發送給函數。如果函數獲取指針而不是值,則指針需要解引用,這可能比發送普通值要慢。

+0

如果指針爲'*',那麼在引用*'&'的情況下將會失去引用,不會涉及「開銷」。對於比用於函數參數的本地寄存器大的類型(通常是內存地址的大小),理論上最好是通過引用而不是整個對象來傳遞值。 – rubenvb 2010-11-06 11:51:49

+0

@rubenvb:您不需要明確解除引用的事實並不意味着沒有隱含的解除引用。在許多(所有?)編譯器中,引用都被實現爲自動解除引用的指針。使用引用意味着在生成的彙編程序中隱式間接尋址(除非函數內聯 - 編譯器可以使用實際變量) – 2010-11-06 12:07:11

+0

我認爲我們正在討論類似'int'或'float'的東西。但是,*和&幾乎是指針類型參數的不同語法,所以我想大衛就在這裏。 – tia 2010-11-06 12:20:32

4

在序數類型的情況下 - 即int,float,bool等 - 沒有使用引用而不是簡單地使用傳遞值的節省。 SourceSource2