首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么RVO / NRVO不总是适用?

为什么RVO / NRVO不总是适用?
EN

Stack Overflow用户
提问于 2014-12-30 17:20:24
回答 2查看 539关注 0票数 2

返回值优化机制的简短摘要(可能是过时的和过于简化的)是类似于的。

实现可以在调用方的堆栈帧中创建隐藏对象,并将该对象的地址传递给函数。然后将函数的返回值复制到隐藏对象(.)中。1991年前后,Walter Bright发明了一种将复制最小化的技术,有效地将函数中的隐藏对象和命名对象替换为用于保存结果1的对象。

由于这是一个非常讨论的主题,所以我只链接我找到的最完整的问:

我的问题是,为什么返回值优化不总是应用?更具体地说(基于[1]中的定义),为什么每次函数调用时都不会发生这种替换,因为函数返回类型(因此堆栈上的大小)总是在编译时知道的,这似乎是一个非常有用的特性。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-30 17:36:08

显然,当值返回lvalue时,没有办法不执行副本。所以,让我们只考虑局部变量。适用于局部变量的一个简单原因是,通常不清楚要返回哪个对象。考虑这样的代码:

代码语言:javascript
复制
T f(Args... args) {
    T v1{some_init(args)};
    T v2{some_other(args)};
    bool rc = determine_result(v1, v2);
    return rc? v1: v2;
}

在创建局部变量v1v2时,编译器无法判断将返回哪个变量,因此可以在适当的位置创建。

另一个原因是复制/移动建筑和破坏可能有故意的副作用。因此,有办法抑制复制是可取的.在引入复制-省略时,已经有大量的C++代码,这些代码可能依赖于要复制的某些副本,也就是说,只有少数情况下才有资格进行复制省略。

票数 5
EN

Stack Overflow用户

发布于 2014-12-30 17:33:07

在某些情况下,要求实现这样做可能是一种去优化,例如返回值被丢弃。如果开始添加异常,就很难证明实现是正确的。

相反,他们采取简单的方式,让实现决定什么时候进行优化,以及什么时候这样做会适得其反。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27709720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档