【发布时间】:2013-09-07 19:12:19
【问题描述】:
一般来说,我想知道现代编译器(例如使用 c++11 的 gcc 4.7 及更高版本)何时以及为何无法应用 NVRO 优化。
编辑:我错误地过度简化了这段代码,没有返回任何局部变量。 @cooky451 提供了一个更好的例子,见ideone.com/APySue
我看到了一些 sn-ps 代码来回答其他类似的问题
A f(A&& v)
{
return v;
}
他们被改成了
A f(A&& v)
{
return std::move(v);
}
因为他们说传递给左值 v 的右值仍然是右值并且可以移动。然而,其他人写道,这将取消 NVRO 的能力。这是吗?如果编译器知道正在返回一个临时对象,它不能直接在原地构造它而不移动任何东西吗?我想我不明白为什么案例一会有 NVRO 而不是案例 2。我可能有错误的事实,因此问题。另外,由于这个原因,我读到案例 2 是一种反模式,您不应该像这样返回 std::move 。任何额外的见解都会有所帮助。有人告诉我,编译器会在幕后创建如下所示的内容:A& __hidden__ 是对函数的赋值,在这种情况下是 myValue。
A myValue = f(A());
// behind the scenes pseudo code for direct in place construction
void f(A&& v, A& __hidden__ )
{
__hidden__ = v;
return;
}
【问题讨论】:
标签: c++ c++11 move-semantics rvalue-reference copy-elision