返回值优化机制的简短摘要(可能是过时的和过于简化的)是类似于这的。
实现可以在调用方的堆栈帧中创建隐藏对象,并将该对象的地址传递给函数。然后将函数的返回值复制到隐藏对象(.)中。1991年前后,Walter Bright发明了一种将复制最小化的技术,有效地将函数中的隐藏对象和命名对象替换为用于保存结果1的对象。
由于这是一个非常讨论的主题,所以我只链接我找到的最完整的问:。
我的问题是,为什么返回值优化不总是应用?更具体地说(基于[1]中的定义),为什么每次函数调用时都不会发生这种替换,因为函数返回类型(因此堆栈上的大小)总是在编译时知道的,这似乎是一个非常有用的特性。
发布于 2014-12-30 17:36:08
显然,当值返回lvalue时,没有办法不执行副本。所以,让我们只考虑局部变量。适用于局部变量的一个简单原因是,通常不清楚要返回哪个对象。考虑这样的代码:
T f(Args... args) {
T v1{some_init(args)};
T v2{some_other(args)};
bool rc = determine_result(v1, v2);
return rc? v1: v2;
}在创建局部变量v1和v2时,编译器无法判断将返回哪个变量,因此可以在适当的位置创建。
另一个原因是复制/移动建筑和破坏可能有故意的副作用。因此,有办法抑制复制是可取的.在引入复制-省略时,已经有大量的C++代码,这些代码可能依赖于要复制的某些副本,也就是说,只有少数情况下才有资格进行复制省略。
发布于 2014-12-30 17:33:07
在某些情况下,要求实现这样做可能是一种去优化,例如返回值被丢弃。如果开始添加异常,就很难证明实现是正确的。
相反,他们采取简单的方式,让实现决定什么时候进行优化,以及什么时候这样做会适得其反。
https://stackoverflow.com/questions/27709720
复制相似问题