【问题标题】:Transmit parameter by value or by reference in C++? [duplicate]在 C++ 中按值或按引用传输参数? [复制]
【发布时间】:2012-10-28 11:32:16
【问题描述】:

可能重复:
Pass by reference more expensive than pass by value

我想知道哪个更好,在 C++ 中按值或按引用发送参数。我听说有些情况下按值发送比按引用发送更快。这些是哪些情况?

谢谢

【问题讨论】:

  • 当您按值发送时 - 创建对象的副本(耗费时间和空间)。所以最好通过 const& 或 & 发送(如果你想修改对象)
  • @UmNyobe 也许在这里Want Speed? Pass by Value.。不过这里也有讨论:stackoverflow.com/questions/2108084/…
  • 引用是使用指针实现的,所以如果参数小于指针,那么按值传递可能会更快。
  • 是的,但是对于基本类型,例如 int 或 float,通过引用发送比通过值发送要慢。我想知道一个类型有哪些字节,以便按值发送比引用更快
  • “我想知道一个类型有哪些字节,以便更快地按值发送而不是引用”。更多取决于:使用哪些汇编指令使该值可用于函数并访问该值。

标签: c++ parameters pass-by-value pass-by-const-reference


【解决方案1】:

作为一般规则,您应该通过值传递 POD 类型,通过 const 引用传递复杂类型。

也就是说,按值传递复杂类型的好地方是无论如何都需要在函数内复制对象。在这种情况下,您有两种选择:

  • 将参数作为 const 引用传递并在函数内创建本地副本

  • 按值传递参数(编译器创建本地副本)。

第二种选择通常更有效。例如,请参阅copy&swap idiom

【讨论】:

    【解决方案2】:

    最明显的情况是,当参数的大小等于或小于指针的大小并且复制起来很简单——那么你会按值传递。然而,这是一个古老的讨论,需要很长的答案才能正确回答给定的架构。还有很多极端情况(例如 RVO)。

    这个问题比速度更重要——语义应该是你的首要任务。

    另请参阅:Is it better in C++ to pass by value or pass by constant reference?

    【讨论】:

      猜你喜欢
      • 2011-02-22
      • 2014-05-14
      • 2023-03-04
      • 2021-11-04
      • 2012-05-22
      • 2012-12-06
      • 1970-01-01
      • 2019-05-07
      • 2012-03-12
      相关资源
      最近更新 更多