C++ 在C+中使用引用传递是否总是更好+;?

C++ 在C+中使用引用传递是否总是更好+;?,c++,pass-by-reference,C++,Pass By Reference,可能的重复项: 我使用下面的代码来确定C++将对象传递为const引用,编译器不复制对象并发送副本。输出确认将对象作为常量引用传递不涉及制作对象的副本 是否存在将对象作为引用传递比将对象作为值传递更糟糕的情况(从效率的角度) 看看哪个描述了你想知道的。基本上,如果必须进行复制,请按值传递 看看哪个描述了你想要知道的。基本上,如果必须进行复制,请按值传递 如果通过非常量引用传递,则表示函数将修改传递的参数 如果按常量引用传递,那么不要忘记传递的代价是指针的副本(在几乎所有的实现中),因此,如果

可能的重复项:

我使用下面的代码来确定C++将对象传递为const引用,编译器不复制对象并发送副本。输出确认将对象作为常量引用传递不涉及制作对象的副本

是否存在将对象作为引用传递比将对象作为值传递更糟糕的情况(从效率的角度)


看看哪个描述了你想知道的。基本上,如果必须进行复制,请按值传递

看看哪个描述了你想要知道的。基本上,如果必须进行复制,请按值传递

如果通过非常量引用传递,则表示函数将修改传递的参数


如果按常量引用传递,那么不要忘记传递的代价是指针的副本(在几乎所有的实现中),因此,如果传递的是基本类型,则不值得。

如果按非常量引用传递,则表示函数将修改传递的参数

如果通过const引用传递,那么不要忘记传递的代价将是指针的副本(在几乎所有的实现中),因此如果传递的是基本类型,则不值得

假设您只想传入一个int的值。如果它是通过值传递的,那么该值就会被推送到堆栈上(或者放入寄存器,不管您的调用约定如何)。在内部,该值被直接检索到其目标寄存器中,以备使用

如果改为通过const引用传递,则传入的是程序在需要时可以去哪里查找值的地址。这意味着为了获得实际值,您的程序必须执行整个额外的内存提取。这并不需要太多额外的时间,但更多的工作其实并不需要

此外,通过值传递,您完全打破了调用方和被调用方在调用点之间的任何依赖关系。这意味着在编译调用者的代码时,编译器可以安全地忽略调用者可能对该变量执行的任何操作或需要从该变量执行的任何操作。对于引用参数(甚至是常量参数),编译器现在必须担心如果调用方保存该变量的地址以供其他源文件中的其他例程稍后使用,会发生什么情况。结果是,当使用值传递时,优化调用方的代码要容易得多,并且编译器能够更好地完成这项工作

当然

假设您只想传入一个int的值。如果它是通过值传递的,那么该值就会被推送到堆栈上(或者放入寄存器,不管您的调用约定如何)。在内部,该值被直接检索到其目标寄存器中,以备使用

如果改为通过const引用传递,则传入的是程序在需要时可以去哪里查找值的地址。这意味着为了获得实际值,您的程序必须执行整个额外的内存提取。这并不需要太多额外的时间,但更多的工作其实并不需要


此外,通过值传递,您完全打破了调用方和被调用方在调用点之间的任何依赖关系。这意味着在编译调用者的代码时,编译器可以安全地忽略调用者可能对该变量执行的任何操作或需要从该变量执行的任何操作。对于引用参数(甚至是常量参数),编译器现在必须担心如果调用方保存该变量的地址以供其他源文件中的其他例程稍后使用,会发生什么情况。结果是,当使用值传递时,优化调用方的代码要容易得多,并且编译器能够更好地完成这项工作

我会把它改为“你的函数可以修改”。即使这样,它也是契约性的,因为我仍然可以在函数内部进行成本转换,如果我想变得非常愚蠢的话。更重要的是,如果你通过常量引用,你将无法调用任何非常量方法,即使它们不修改对象。嗯,这就是为什么这些方法应该首先声明为const。我会将其改为“您的函数可能会修改”。即使如此,它也是契约性的,因为我仍然可以在函数内部使用cost_cast进行操作,如果我想变得非常愚蠢的话。更重要的是,如果您通过const引用,您将无法调用任何非const方法,即使它们不修改对象。这就是为什么这些方法首先应该声明为const。例如+1。另一方面,C++内存模型是单线程的,编译器不需要考虑给定变量是否可以被外部修改,除非该变量被标记为<代码> Value。然后再一次。。。编译器可以决定生成一个本地参数
register
,但它不能通过引用来实现这一点,因此在一天结束时,优化器会有一些小的差异。例如+1。另一方面,C++内存模型是单线程的,编译器不需要考虑给定变量是否可以被外部修改,除非该变量被标记为<代码> Value。然后再一次。。。编译器可以决定生成一个本地参数
register
,但它不能通过引用来实现这一点,因此在一天结束时,优化器会有一些小的差异。
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;

}