2013-11-21 46 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是相当简单的功能)。