c ++中pass-by-value和pass-by-reference之间的差异

时间:2013-11-21 19:46:52

标签: c++ pass-by-reference pass-by-value

我想知道以下两个函数中的哪一个在时间和空间方面最有效。它们都检查堆栈中是否存在某个元素。第一个使用按值传递机制,而第二个使用pass-by-reference。我可能错了,但我认为pass-by-value机制隐式复制参数,而在pass-by-ref中我们明确地执行它。

第一版按值传递:

 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;

}

2 个答案:

答案 0 :(得分:7)

如果您要在函数内部制作本地副本,请使用pass by value。它更简单,更简单通常是好的。

P.S。当您返回bool结果时,通常不需要if语句。

return !source.isEmpty();

答案 1 :(得分:1)

在这种情况下,通过值传递它肯定更好。正如马克所说,无论如何,你的传递参考版本都会制作副本。

在这种情况下,pass-by-value更好,因为您向编译器提供了更多信息,因此它可以进行更好的优化。您保证find函数source中的内容实际上只是属于find的值。当您通过引用传递一些值时,编译器无法判断是否存在对同一实例的某些其他(非常量)引用,这可以在执行source时修改find。 (好吧,在这种情况下它可能是相同的,find是非常简单的功能)。