按值传递还是按引用传递

3
void Subroutine1(int Parameter1)

void Subroutine2(const int &Parameter1) 

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

实际上,Subroutine1 似乎比另一个子程序更常用。这是为什么呢?


2
如果使用整数,那么你不会节省任何开销,因为传递指向整数的指针所需的时间/内存与传递整数的副本相同。 - TJD
7个回答

5

实际应用中,Subroutine1的使用似乎比其他方法更常见。为什么会这样呢?

因为复制int类型变量要比创建引用(或指针)再访问它要更好。

更普遍地说,所有基本类型都应该按值传递。


2

因为当你处理原始类型(例如int)时,按引用传递实际上从性能上来说比按值传递更差。它也没有提供任何优势。


为什么“传递指针而不是引用更加常规”? - Terry Li
@TerryLiYifeng:因为几十年的C代码都是这样做的,所以你更有可能看到人们遵循这个例子。但在这种情况下使用引用并没有技术上的问题。 - Jon
@downvoter:请留下评论帮助我改进这个答案。 - Jon
@Jon 只有老的API和只会用C++的C程序员才会使用多个返回值的方式。 而且,多个返回值的问题并不适用于关于按值传递还是按const&传递的问题。 - David
@Dave:好的,删掉第二段只留下答案中相关的部分。 - Jon

1
一个传递整数,另一个传递引用。正如其他人所说,创建和访问整数的引用并没有比仅仅复制整数有多大的区别。

2
这不是大小的问题。如果一个引用通过指针实现,你就增加了解引用该指针的开销。 - Jon

0

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


0
传引用在一定程度上意味着被调用者可以改变任何被引用的内容,并使该变化对调用者生效。如果是这种情况,你可能想将int封装成一个对象,并通过引用将其传递到函数中。这提供了更明确的代码。

0

首先,对于 int 类型,按值传递比按引用传递更快。但对于您自己的类和结构体,按引用传递更快。

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

在我看来,对于普通函数来说,原始类型参数的 const 引用是无用的。它使代码有点难以理解,因此不要使用它。


0
对于原始数据类型(如intdoublechar)通常较小的情况下,第一种情况通常比第二种情况更快(可访问性)和更便宜。请记住,引用与指针实现方式相似。
另外,如果Parameter1不会被修改,那么我个人会选择第三种替代方案。
void Subroutine3(const int Parameter1);

1
在这里添加const的意义是什么,因为Parameter1的原始数据不会被改变呢? - Terry Li
实际上,void Subroutine3(const int Parameter1);void Subroutine3(int Parameter1); 声明了同一个函数,因此在声明(头文件中)中列出您的实现细节是没有必要的。 - UncleBens
1
@TerryLiYifeng,这句话的意思是要提到Parameter1在函数内部同样没有被改变 - iammilind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接