返回值优化(Return value optimization,RVO)是一种优化技术,涉及复制省略(copy elision),可在某些情况下消除用于保存函数返回值的临时对象。我了解RVO的一般好处,但我有几个问题。
标准在§12.8第32段中对其进行了以下说明:(本文草案)(强调我的)。
当满足特定条件时,实现可以省略类对象的复制/移动构造,即使该对象的复制/移动构造函数和/或析构函数具有副作用。在这种情况下,实现将省略的复制/移动操作的源和目标视为仅表示同一对象的两种不同方式,并且该对象的销毁发生在两个对象将在没有进行优化的情况下被销毁的时间之后。
然后列出了许多实现可能执行此优化的标准。
我有几个关于此潜在优化的问题:
我习惯于将优化限制为不更改可观察行为。这个限制似乎不适用于RVO。我需要担心标准中提到的副作用吗?是否存在可能导致问题的边缘情况?
作为程序员,我需要做什么(或不做)才能允许执行此优化?例如,以下内容是否禁止使用复制省略(由于
move
):
std::vector<double> foo(int bar){
std::vector<double> quux(bar,0);
return std::move(quux);
}
编辑
我把这个问题作为一个新问题发布,因为我提到的具体问题在其他相关问题中没有得到直接回答。
auto x = foo(42);
有两种可能的优化方式:1)从quux
复制/移动到返回值临时变量。2)从返回值临时变量复制/移动到x
。第一种是 NRVO,仅在返回语句中的表达式是名称(即move(quux)
禁止该优化)时才会发生。第二种仍然可以应用。 - dyp