当使用按引用调用更有效时,将参数作为按值调用的目的是什么?(对于非原始数据类型。)
另外,如果要将 const 标记添加到按引用调用的参数中,这样它们就不会被修改怎么办?
是否存在使用按值调用而不是按引用调用的情况?
当使用按引用调用更有效时,将参数作为按值调用的目的是什么?(对于非原始数据类型。)
另外,如果要将 const 标记添加到按引用调用的参数中,这样它们就不会被修改怎么办?
是否存在使用按值调用而不是按引用调用的情况?
在某些情况下,无论效率如何,按值传递只是您想要的——如果您希望能够在不影响原始内容的情况下传递并操作/修改它,那么按值传递可能是完全正确的事情,如果它更慢然后它更慢。
举一个真实的例子,考虑我们正在处理一个priority_queue——但在某些情况下,我们希望将该优先级队列的当前内容写入日志(按顺序)。从优先级队列中读取是破坏性的,但我们需要原始的完整。一种明显的解决方案:将优先级队列按值传递给日志记录函数。日志记录功能从队列中进行破坏性读取,但完成后,周围的代码仍然具有原始队列,未修改。
在任何情况下,无论出于何种原因,您的函数体已经需要参数的副本,通常按值传递该参数更有效,因为在某些情况下,编译器实际上可以消除该副本。
并非按引用调用总是比按值调用更有效。传递整数而不是对整数的引用通常是一种更便宜的间接方式。根据参数列表,一些值可以在寄存器中传递,而不是间接地在内存中的某处取消引用
使用引用调用更有效吗?
这远不能确定:在某些情况下,按值传递参数比通过引用传递参数更有效,因为您传递的数据“少于指针价值”。
是否存在使用按值调用而不是按引用调用的情况?
按值传递意味着复制。当您想确保获得对象的副本而不是对象本身时,可以使用它。例如,如果您想确保对象不会与使用它的代码同时被修改,请编写一个按值接收其参数的函数。
我保存的摘录可能对您有用(来自CodingUnitTutorials)
不使用引用调用有两个可能的原因:副作用和隐私。不想要的副作用通常是由于对引用参数调用的无意更改造成的。同样在大多数情况下,您希望数据是私有的,并且调用函数的人只能在您需要时进行更改。因此,最好默认使用按值调用,并且仅在预期数据更改时才使用按引用调用。
大多数情况下,当不应该更改原始数据并且无论如何都会在函数内部创建引用的副本时,会使用这种按值调用。
一个例子是变量是volatile,这意味着它可以被另一个执行线程或程序外部的东西改变,比如硬件寄存器。
按值传递时,在传递给函数之前会获取变量的副本或快照。通过引用传递时,功能代码将获取变量被访问时的值。这可能会导致不同的值,具体取决于是否以及何时更改volatile变量。