可能重复:
“const T &arg” vs. “T arg”
How to pass objects to functions in C++?
我使用以下代码来确定C ++在传递对象作为const引用时编译器不会复制对象并发送副本。输出确认将对象作为const引用传递不涉及制作对象的副本。
是否存在将对象作为引用传递比将对象作为值传递更糟糕的情况(从效率角度来看)?
class ABC {
public:
int abc_1;
int abc_2;
};
void swapABC ( ABC & _abc_ ) {
_abc_.abc_2 = ( _abc_.abc_1 + _abc_.abc_2 ) - ( _abc_.abc_1 = _abc_.abc_2 ) ;
printf ( "%d\n", ( void * ) &_abc_ ) ;
}
int main ( ) {
ABC x = { 1,2 };
swapABC ( x );
printf ( "%d\n", ( void * ) &x ) ;
return 0;
}
答案 0 :(得分:4)
不确定
假设您要做的就是传入int的值。如果它是通过值传递然后该值被推送到堆栈上(或放入寄存器,但是您的调用约定会执行它)。在内部,值被直接检索到其目标寄存器中以供使用。
如果你是通过const引用传递它,传入的是程序在需要时找到值的地址。这意味着为了获得实际值,您的程序将不得不进行全部额外的内存提取。它不会花费太多额外的时间,但更多的工作并不是真正需要的。
此外,通过值传递,您可以完全打破呼叫时呼叫者和被呼叫者之间的任何依赖关系。这意味着在编译调用者的代码时,编译器可以安全地忽略调用者可能对调用所在的那一点之外的变量所做的或需要的任何事情。使用引用参数(甚至是const参数),编译器现在必须担心如果调用者保存该变量的地址以供以后由其他源文件中的其他例程使用,可能会发生什么。结果是,当使用值传递时,更容易优化调用者的代码,并且编译器可能能够更好地完成它。
答案 1 :(得分:1)
查看this link,其中详细描述了您想要了解的内容。基本上,如果您必须复制,请按值传递。
答案 2 :(得分:1)
如果您通过非const引用,则表示您的函数将修改传递的参数。
如果你通过const引用传递,那么不要忘记传递的代价是指针的副本(几乎在所有实现中),所以如果你传递一个基本类型它是不值得的。