2012-05-26 29 views
0

當傳遞參數,這將在很短的時間量被稱爲數百萬次的函數和方法,傳球的開銷表示參數開始顯現。性能相關的問題WRT傳遞的參數引用函數/方法

無效美孚(常量SOMETYPE & ST) { ... }

對於類型等的std :: string,性病::矢量等...規則是通過引用傳遞,使得無意義副本不會發生。然而,在處理諸如雙打,整數等POD時,故事是完全不同的。

至於性能,如果函數/方法不需要變異的參數,有哪些常見的「東西看出來的」決定是否應該按引用傳遞,引用或複製時?

void foo1(SomeType& st) 
{ 
    ... 
} 

void foo2(const SomeType& st) 
{ 
    ... 
} 

void foo3(SomeType st) 
{ 
    ... 
} 

void foo4(SomeType* st) 
{ 
    ... 
} 
  • 如果一個int/unsigned int類型總是通過複製傳遞?
  • 是否應該只在64位或更高的目標上通過複製來傳遞double?
  • 如果函數可以內聯 - 參數是如何傳遞的?
  • 混淆如何通過ref/const ref傳遞時影響問題?
  • 在什麼情況下參數的顯式副本在堆棧上有利?

注:這是不是一個關於常量,正確性問題。還在32/64位平臺上尋找與gcc和msvc有關的答案。

一些可能與Q /作爲:

"const T &arg" vs. "T arg"

https://stackoverflow.com/a/2139254/754951

Pass by Reference/Value in C++

Why pass by const reference instead of by value?

+0

可能重複的[如何將對象傳遞給C++中的函數?](http://stackoverflow.com/questions/2139224/how-to-pass-objects-to -functions-in-c) –

回答

6

最好的答案是你讀你的平臺的調用約定,但一般來說,對於小型(適合的類型)一個註冊表,甚至有時候稍大一點),通過價值傳遞通常會更快。當你通過指針或引用指針通過值傳遞,這將有相同的複製原始對象的成本,再加上它需要解除引用。

當物體變大,然後複製該指針加上反引用的成本通常比複製一個大對象的成本小,所以你應該使用引用。如果您不打算修改對象,請通過const&

如果一個int/unsigned int類型總是通過複製傳遞? 是否應該只在64位或更高的目標上通過複製來傳遞雙精度值?

即使在32位體系結構中,您也應該通過整數和雙精度值。再次看看你的架構調用約定(通常用編譯器記錄)。

如果函數可以內聯 - 參數是如何傳遞的?

如果該函數被內聯,編譯器可以優化它,例如,通過將原始對象的引用替換爲適當的位置來刪除引用的代價。

混淆如何通過ref/const ref傳遞時影響問題?

如果您不打算修改參數(如您在問題中聲明的那樣),別名不會影響。如果您傳遞的指針/引用可以以算法不期望的方式修改,則會出現鋸齒問題。

在什麼情況下參數的顯式副本對堆棧有利?

忽略在堆疊部分:當所述對象是。請注意,所使用的調用約定甚至可能不使用堆棧(它可能會將值傳遞到寄存器中)。我建議你閱讀這篇文章的不同calling conventions

+0

謝謝你的回答,非常翔實! +1 –

+0

Rodriquez:順便說一句你同意從這裏回答:http://stackoverflow.com/a/2139254/754951考慮到有關雙打的問題? –

+0

我的經驗法則(與此一致):如果它適合寄存器,按值傳遞。否則通過參考。 – Crashworks