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

P45*_*ent 4 c++ rvo nrvo

我们都知道

Foo returnAFoo()
{
    return Foo();
}
Run Code Online (Sandbox Code Playgroud)

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

Foo returnAFoo()
{
    Foo f = Foo();
    return f;
}
Run Code Online (Sandbox Code Playgroud)

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

Sim*_*ple 7

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

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

如果在同一函数中混合使用NRVO和RVO,则很难应用优化.


演示NRVO的示例代码.