【问题标题】:Why returning by reference is faster than returning by value? [duplicate]为什么按引用返回比按值返回更快? [复制]
【发布时间】:2013-08-12 17:23:26
【问题描述】:
class A
{
    int x,y;
    public:
       A(int a=0,int b=0)
       {x=a;y=b;}
    /* ... */
}

A& fctr()
{
    A loc(1,2);
    return loc;
}

让我们看看这条指令:

A x=fctr();

fctr() 返回对已销毁对象的引用...

在上面的指令中,程序根据 fctr 返回的引用复制被破坏的对象 loc 到 x 中。

另一方面,按值返回 copy 对象 loc 到 x !!

我看到的唯一区别是,当通过引用返回时,对象 loc 被破坏,但是当按值返回时,对象 loc 不会破坏 直到指令结束。

所以按值返回似乎是安全的,它和按引用返回一样!!

我在书上看到的和从人们那里听到的是,按引用返回比按值返回要快......

那么为什么按引用返回比按值返回快呢?

...我觉得我错了,但我不知道是什么?!!!

【问题讨论】:

  • "这不是问题-_-" 这就是问题。
  • 速度并不快。这是未定义的行为。
  • 我知道这是个问题-_-,但现在我要说的是这两种方式中哪一种更快,以及为什么...
  • 为什么不返回对临时的引用是一个问题?因为x 的类型是A,所以正在制作副本;如果您将其更改为A& x = fctr();,则不会复制,您将在其上引用无效内存。即使现在您的程序具有未定义的行为,因为正如您所注意到的,副本是在 临时文件被销毁之后制作的。只有当您知道后备存储的生命周期大于或等于将接收引用的任何东西的生命周期时,才应通过引用返回。
  • fctr 中,a 是什么?

标签: c++ reference return-by-reference


【解决方案1】:

通过引用返回 - 系统不需要分配和初始化任何额外的内存。只需传递已存在位置的内存地址即可。

按值返回 - 系统需要分配和初始化额外的内存。

这完全取决于你需要“按引用”还是“按值”的要求。

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 2021-11-13
    • 2015-10-03
    • 1970-01-01
    • 2018-07-29
    • 2016-09-28
    • 2011-11-10
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多