为什么在C++中使用按值调用



当使用引用调用更有效时,将参数作为按值调用的目的是什么?(对于非原始数据类型。)

此外,如果添加const标记以通过引用参数进行调用,这样它们就不会被修改呢?

是否存在使用按值调用而不是按引用调用的有益的情况?

我保存的摘录,您可能会发现它很有用(来自CodingUnitTutorials)

不使用引用呼叫有两个可能的原因:副作用和隐私。不需要的副作用通常是由引用参数对调用所做的不经意的更改引起的。此外,在大多数情况下,您希望数据是私有的,并且调用函数的人只能在您希望的情况下进行更改。因此,最好在默认情况下使用按值调用,并且只有在预期数据更改时才使用按引用调用。

在任何情况下,无论出于何种原因,函数体已经需要参数的副本,通常按值传递该参数会更有效,因为在某些情况下,编译器实际上可以消除该副本。

并非引用调用总是比值调用更有效率。传递一个整数而不是引用一个整数通常是一个间接的便宜。根据参数列表的不同,一些值可以在寄存器中传递,而不是间接地在内存中某个地方取消引用

引用调用更有效?

这还远远不能确定:在某些情况下,按值传递参数比按引用传递参数更有效,因为您传递的数据"不到指针值"。

是否存在使用按值调用而不是按引用调用的情况?

传递值意味着复制。当您希望确保获得对象的副本,而不是对象本身时,可以使用它。例如,如果您希望确保对象不会在使用它的代码的同时被修改,那么编写一个按值接收其参数的函数。

在某些情况下,无论效率如何,传递值都是您想要的——如果您希望能够传递某些内容并对其进行操作/修改而不影响原始内容,那么传递值可能是正确的,如果速度较慢,则速度较慢。

对于一个真实的例子,考虑我们正在处理一个优先级队列——但在某些情况下,我们希望将该优先级队列的当前内容(按顺序)写入日志。从优先级队列中读取是破坏性的,但我们需要原始队列完好无损。一个显而易见的解决方案是:按值将优先级队列传递给日志记录函数。日志记录函数从队列中进行破坏性读取,但完成后,周围的代码仍然具有未修改的原始队列。

还有相当多的情况下,通过值传递实际上比通过引用传递效率更高。

大多数情况下,当不应该更改原始数据并且无论如何都会在函数内创建引用的副本时,会使用此按值调用。

一个例子是变量为volatile,这意味着它可以由另一个执行线程或程序外部的东西(如硬件寄存器)更改。

传递值时,在传递给函数之前,将获取变量的副本或快照。通过引用传递时,函数代码将获得访问变量时的值。这可能会导致不同的值,具体取决于volatile变量是否以及何时更改。

相关内容

  • 没有找到相关文章

最新更新