按值调用vs const调用引用

use*_*577 2 c++ const reference

我对于按值调用和通过引用调用const之间的差异感到有些困惑.有人可以向我解释一下.例如,它们是否都可以防止更改调用者参数,它们是否适用于所有对象大小,是在一个不复制时复制参数,还是在复制时使用更多内存?

And*_*owl 6

他们都防止改变呼叫者的论点

按值传递会创建调用者提供的参数的副本,因此无论函数做什么,它都会在单独的对象上执行.这意味着永远不会触及原始对象,因此在这种情况下答案是" ".

const另一方面,通过引用传递,让函数引用调用者提供的相同对象,但它不会让该函数修改它... 除非(正如Luchian Grigore在评论中正确评论)函数的实现者用于const_cast<>抛弃const引用中的-ness,这只有在知道绑定到引用的对象未被声明为const类型时才能安全地完成(否则,您将获得未定义的行为).

因为考虑到你的问题,这似乎不是最可能的情况,并且考虑到通常接受引用const表示不会触及参数的承诺,那么答案是,只要我们假设这个承诺是履行,通过引用传递const不会改变调用者提供的参数.所以答案是" " - 我上面提到的一点点警告.

它们对所有物体尺寸都很快

不.虽然你应该首先定义"快".如果要传递的对象的类型复制(或移动,如果执行移动而不是复制)的代价很高,则传递值可能会很慢.无论您传递的值的类型是什么,通过引用传递总是会花费相同的(地址的大小).

通知,即对某些结构和某些数据类型(如char)通过由值可能比通过引用传递较快,而相反的通常为足够大的UDT真.

在制作副本时使用更多内存?

由于其中只有一个人正在制作副本,因此问题有一个明显的答案.