引入新变量会导致返回值优化吗?

时间:2016-03-23 08:41:23

标签: c++ rvo nrvo

我们都知道

Foo returnAFoo()
{
    return Foo();
}

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

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

太?调试时,第二个结构可能会有所帮助。但是我这样做会丢掉一个重要的优化吗?也许我需要编写一个显式的移动构造函数?

1 个答案:

答案 0 :(得分:7)

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

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

如果在同一功能中混合使用NRVO和RVO,则很难应用优化。

Sample code展示了NRVO。