【问题标题】:Passing by value or passing by reference按值传递或按引用传递
【发布时间】:2012-01-16 01:21:50
【问题描述】:
void Subroutine1(int Parameter1)

void Subroutine2(const int &Parameter1) 

在 Subroutine1 中,我们必须获取参数的副本,而在 Subroutine2 中,我们不必制作副本,这可能会节省一些开销。

实际上,Subroutine1 似乎比另一个更频繁地使用。为什么会这样?

【问题讨论】:

  • 如果使用 int,则不会节省任何开销,因为传递指向 int 的指针所花费的时间/内存与传递 int 的副本一样多。

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


【解决方案1】:

实际上,Subroutine1 似乎比另一个更常用。 为什么会这样?

因为复制一个 int 比创建一个引用(或指针)然后访问它更好。

更一般地说,所有原始类型都应该按值传递。

【讨论】:

    【解决方案2】:

    因为当您处理原始类型(例如int)时,按引用传递实际上比按值传递在性能方面更糟糕。它也没有为您提供任何东西。

    【讨论】:

    • 为什么“传递指针而不是引用更为传统”?
    • @TerryLiYifeng:因为数十年的 C 代码都是这样做的,所以你更有可能看到人们遵循这个例子。但是在这种情况下使用引用在技术上没有任何问题。
    • @downvoter:请留下评论帮助我改进这个答案。
    • @Jon 只有不习惯 C++ 的旧 API 和 C 程序员仍然以这种方式执行多个返回值。此外,多返回值的事情不适用于有关按值传递与按 const& 传递的问题。
    • @Dave:很公平。删除了第二段,只保留答案中的相关位。
    【解决方案3】:

    一个传递一个int,另一个传递一个引用。正如其他人所说,创建和访问对 int 的引用与复制 int 没有太大区别。

    (根据正确评论编辑)

    【讨论】:

    • 这不是大小的问题。如果通过指针实现引用,则增加了取消引用该指针的开销。
    【解决方案4】:

    通过引用传递(几乎总是)通过传递指针来实现。这意味着,对于像int 这样的简单类型,第二个版本的效率可能较低——传递指针的成本与传递简单对象的成本差不多,然后函数需要取消引用该指针。

    【讨论】:

      【解决方案5】:

      对于通常较小的原始数据类型(如int、double、char),与第二种情况相比,第一种情况通常更快(可访问性)且更便宜。请记住,引用的实现或多或少类似于指针。

      附带说明,如果Parameter1不打算修改,那么我个人会选择第三种替代方案,

      void Subroutine3(const int Parameter1);
      

      【讨论】:

      • 在这里添加 const 有什么意义,因为 Parameter1 的原始数据无论如何都不会改变?
      • 确实,void Subroutine3(const int Parameter1); 和 void Subroutine3(int Parameter1); 声明了相同的函数,因此没有理由在声明中(在标题中)列出您的实现细节。
      • @TerryLiYifeng,目的是提一下Parameter1也在函数内部没有改变。
      【解决方案6】:

      在某种程度上,引用传递意味着被调用者可以改变所引用的任何内容,并使该改变在调用者中生效。如果是这种情况,您可能希望将 int 包装为一个对象并通过引用将其传递给函数。这提供了更明确的代码。

      【讨论】:

        【解决方案7】:

        首先,对于int类型,传值比传引用快。但是对于你自己的类和结构,通过 ref 更快。

        这两种方法对于原始类型的开销差异实际上非常小,在大多数情况下您可以忽略它。

        在我看来,原始类型参数的 const ref 对普通函数没有用处。而且它使代码有点晦涩,所以不要使用它。

        【讨论】:

          猜你喜欢
          • 2012-10-14
          • 2019-05-07
          • 2012-03-12
          • 2013-09-15
          • 1970-01-01
          • 2014-08-23
          • 2015-05-23
          • 1970-01-01
          相关资源
          最近更新 更多