是否引入了一种新的可变失败回报值优化

Does introducing a new variable defeat return value optimisation?

本文关键字:失败 回报 优化 一种 是否      更新时间:2023-10-16

我们都知道

Foo returnAFoo()
{
    return Foo();
}

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

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

也是吗?第二个构造在调试时可能会有所帮助。但是,在这样做的过程中,我是否放弃了一个重要的优化?也许我需要写一个显式的移动构造函数?

否。复制省略仍然可以在此处应用。在这种特定情况下,它被称为NRVO(命名为返回值优化)。执行复制省略不需要移动构造函数;自C++98/03以来,复制省略就一直存在于标准中,当时我们只有复制构造函数。

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

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


演示NRVO的示例代码。