引入新变量是否会破坏 return 值优化?

Does introducing a new variable defeat return value optimisation?

我们都知道

Foo returnAFoo()
{
    return Foo();
}

将使用 return 值优化进行编译,因此即使 Foo 的复制构造函数有副作用,也不会进行值复制。但是会

Foo returnAFoo()
{
    Foo f = Foo();
    return f;
}

也是吗?第二个构造在调试时很有用。但是我这样做是不是放弃了一个重要的优化?也许我需要写一个明确的移动构造函数?

没有。复制省略仍然可以在这里应用。在这种特定情况下,它称为 NRVO(名为 return 值优化)。您不需要移动构造函数来执行复制省略;自 C++98/03 以来,复制省略一直是标准,当时我们只有复制构造函数。

为了最大限度地提高使用复制省略的机会,您应该确保:所有代码路径 return 同一对象 (NRVO) 或所有代码路径 return 一个临时对象 (RVO ).

如果您在同一函数内混合搭配 NRVO 和 RVO,则很难应用优化。


Sample code 演示 NRVO。