通过价值传递或通过引用传递

时间:2011-12-08 16:00:39

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

void Subroutine1(int Parameter1)

void Subroutine2(const int &Parameter1) 

在Subroutine1中,我们必须获得参数的副本,而在Subroutine2中我们不必进行复制,这可能会节省一些开销。

在实践中,Subroutine1似乎比其他使用频繁。为什么会这样?

7 个答案:

答案 0 :(得分:5)

  

在实践中,Subroutine1似乎比其他使用频繁。   为什么会这样?

因为复制int比创建引用(或指针)然后访问它更好。

更一般地说,所有原始类型都应该按值传递。

答案 1 :(得分:2)

因为当你处理原始类型(例如int)时,通过引用传递实际上更差性能明显比传递值。它也没有为你提供任何东西。

答案 2 :(得分:1)

一个传递一个int,另一个传递一个引用。正如其他人所说的那样,创建和访问对int的引用与仅复制int没有多大区别。

(根据正确评论编辑)

答案 3 :(得分:0)

通过引用传递(几乎总是)通过传递指针来实现。这意味着,对于像int这样的简单类型,第二个版本可能效率较低 - 传递指针的成本与传递简单对象的成本大致相同,然后函数需要取消引用该指针。

答案 4 :(得分:0)

对于通常尺寸较小的原始数据类型(如intdoublechar),第一种情况通常更快(可访问性)并且与第二种情况相比更便宜。请记住,引用的实现或多或少类似于指针。

另外注意,如果Parameter1不会被修改,那么我个人会选择第3种替代方案,

void Subroutine3(const int Parameter1);

答案 5 :(得分:0)

在某种程度上传递引用意味着被调用者可以改变所引用的任何内容并使该突变在调用者中生效。如果是这种情况,您可能希望将int包装一个对象并通过引用将其传递给函数。这提供了更明确的代码。

答案 6 :(得分:0)

首先,对于int类型,pass by value比通过引用传递更快。但是对于你自己的类和结构,传递ref更快。

这两种原始类型方法之间的开销差异实际上非常小,在大多数情况下你可以忽略它。

在我看来,原始类型参数的const ref对于普通函数是没用的。它使代码有点模糊,所以不要使用它。