【发布时间】:2013-11-16 12:18:16
【问题描述】:
返回值优化 (RVO) 是一种涉及复制省略的优化技术,它消除了在某些情况下为保存函数返回值而创建的临时对象。我总体上了解 RVO 的好处,但我有几个问题。
该标准在this working draft(强调我的)第 32 段第 12.8 节中对此做了以下说明。
当满足某些条件时,允许实现省略类对象的复制/移动构造,即使对象的复制/移动构造函数和/或析构函数有副作用。在这种情况下,实现将省略的复制/移动操作的源和目标简单地视为引用同一对象的两种不同方式,并且该对象的销毁发生在两个对象本应被删除的较晚时间。没有优化就销毁了。
然后它列出了当实现可以执行此优化时的一些标准。
我有几个关于这种潜在优化的问题:
我习惯于优化受到约束,以至于它们无法改变可观察到的行为。此限制似乎不适用于 RVO。 我是否需要担心标准中提到的副作用?是否存在可能导致麻烦的极端情况?
作为程序员,我需要做什么(或不做什么)才能执行此优化?例如,以下是否禁止使用复制省略(由于
move):
std::vector<double> foo(int bar){
std::vector<double> quux(bar,0);
return std::move(quux);
}
编辑
我将此作为一个新问题发布,因为我提到的具体问题在其他相关问题中没有直接回答。
【问题讨论】:
-
嗯,可能不是重复的。你最好重新提出这个问题。
-
@RedX 我会更改标题。它并不是真正的重复,但我明白你为什么怀疑它。
-
auto x = foo(42);有两种可能的优化 1) 从quux复制/移动到临时返回值。 2) 从返回值临时复制/移动到x。第一个是 NRVO,只有当返回语句中的表达式是 name 时才会发生(即move(quux)禁止该优化)。第二个仍然可以应用。
标签: c++ c++11 compiler-optimization