【问题标题】:Passing by Reference or Value通过引用或值传递
【发布时间】:2020-10-21 01:47:25
【问题描述】:

我试图了解按值传递和按引用传递之间的区别。什么时候通过引用传递比通过值传递更快(反之亦然)?另外,在什么情况下通过引用传递比通过值传递使用更少的内存(反之亦然)?

【问题讨论】:

  • 通过引用传递更有效,因为您避免在内存中创建临时对象,因此无需分配或取消分配内存,您只需传递已创建对象的地址。(但您必须记住,通过引用传递您修改的原始变量,然后您可以再次将const 作为您的参数以避免在函数内部进行修改)。按值传递意味着您正在创建临时副本,因此编译器必须做更多工作,创建临时对象并传递给函数,仅在函数结束时被销毁。

标签: c++


【解决方案1】:

什么时候通过引用传递比通过值传递更快(反之亦然)?

这可能是一个棘手的问题,因为它通常归结为“视情况而定”。

通过引用传递可避免复制参数。对于简单的对象,复制并没有那么昂贵(可能不比使用引用更昂贵),但对于大型对象来说可能是这样。如果您使用的是其他人的课程,您可能不得不求助于性能测试来了解避免复制所带来的性能节省。

每当需要参数的值时,通过引用传递也会增加一个间接级别。这意味着使用该参数的速度较慢。您使用该参数的次数越多,此效果就越明显。同样,测量以了解效果的大小,但我的理解是,在代码的性能关键部分之外,额外的间接级别通常是微不足道的。

另外,在什么情况下通过引用传递会比通过值传递使用更少的内存(反之亦然)?

这是相当直截了当的。当您按值传递时,您将值放在堆栈上。所需的空间是对象的大小。当您通过引用传递时,您将指针放在堆栈上。所需的空间是指针的大小。如果sizeof(argument) < sizeof(argument*),则按值传递占用更少的内存,而在sizeof(argument) > sizeof(argument*) 时,按引用传递占用更少的内存。

在典型的 64 位系统上,对于大多数基本类型(例如 charshortintfloat),按值传递使用的内存更少,并且与大多数其他(例如long longdouble,但不适用于long double)。请记住,这是典型的,不是标准规定的。


根据经验,对于long 和更小,除非您需要引用(因为该函数应该更改提供的参数),否则按值传递。对于维护多条数据的对象,除非您需要副本,否则按引用传递。一个被记录为“复制成本低”的类可能应该属于前一种类别(按值传递),无论您对它维护多少数据的理解。

【讨论】:

    【解决方案2】:

    如果您通过引用传递,则可以修改传递的变量。但是,如果您按值传递,则无法执行此操作。数组是此规则的一个例外,您可以随意传递它们。希望这会有所帮助!

    【讨论】:

    • 从技术上讲,您不能通过值传递数组,只能通过引用传递。但是,您可以通过值传递它很乐意衰减到的指针。
    • 这个答案没有解决所提出的问题,即关于速度和内存的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 2016-05-04
    • 1970-01-01
    • 2011-06-20
    • 2020-04-01
    • 2013-09-10
    • 2020-04-10
    • 2012-06-03
    相关资源
    最近更新 更多