4

我们都知道

Foo returnAFoo()
{
    return Foo();
}

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

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

也?第二个构造在调试时会很有帮助。但是我这样做是不是丢掉了一个重要的优化?也许我需要编写一个显式的移动构造函数?

4

1 回答 1

7

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

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

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


演示 NRVO 的示例代码。

于 2016-03-23T08:48:24.817 回答