c – 引入新变量是否会导致返回值优化?

我们都知道

Foo returnAFoo()
{
    return Foo();
}

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

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

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

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

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

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

Sample code展示了NRVO.

转载注明原文:c – 引入新变量是否会导致返回值优化? - 代码日志