2013-11-21 82 views
0

我想知道以下兩個函數中哪一個在時間和空間上最有效。它們都檢查堆棧中是否存在某個元素。第一個使用傳值機制,而第二個使用傳遞引用。我可能是錯的,但我認爲傳值機制隱式地複製了參數,而在pass-by-ref中,我們明確地執行它。C++中傳遞值與傳遞引用之間的區別

第一版通過按值:

template<class T> 
bool find (stack<T> source, T value) 
{ 
    while (!source.isEmpty() && source.top() != value) 
     source.pop(); 

    if (!source.isEmpty()) 
     return true; 

    return false; 
} 

第二版本通過按引用:

template<class T> 
bool find (const stack<T> &source, T value) 
{ 
stack<T> temp = source; 
while (!temp.isEmpty() && temp.top() != value) 
    temp.pop(); 

if (!temp.isEmpty()) 
    return true; 

return false; 

}

+0

你的假設大部分是正確的。按引用傳遞的效率與傳遞指向對象的指針效率相同。 –

+1

此代碼看起來很熟悉..... :) –

回答

7

如果你將要作出一個本地副本無論如何,在功能裏面,使用價值傳遞。這更簡單,更簡單通常是好的。

P.S.當您返回bool結果時,通常不需要if聲明。

return !source.isEmpty(); 
+1

在複製版本中還有一些複製elision的作用域。 – juanchopanza

1

在這種情況下,通過價值傳遞肯定更好。正如馬克所說,無論如何你的傳遞參考版本都會複製。

在這種情況下,按值傳遞會更好,因爲您向編譯器提供了更多信息,因此可能會做出更好的優化。你保證在你的find函數source內真的是一個只屬於find的值。當通過引用傳遞某個值時,編譯器無法判斷是否存在對同一實例的其他(非const)引用,在執行find時可以修改source。 (好吧,在這種情況下它可能是相同的,find是相當簡單的功能)。