【问题标题】:Does introducing a new variable defeat return value optimisation?引入新变量是否会破坏返回值优化?
【发布时间】:2016-03-23 08:41:23
【问题描述】:

我们都知道

Foo returnAFoo()
{
    return Foo();
}

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

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

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

【问题讨论】:

  • 请注意,返回值优化有一个特定的变体,称为 Named 返回值优化 (NRVO)。有时它比“普通”RVO 更难,但通常编译器可以做到。两者都与移动物体完全不同。如果您有显式复制构造函数/赋值运算符,那么您也需要显式定义移动构造函数/赋值运算符。
  • @BoBTFish:请把它作为答案:我会接受。
  • @P45 我不会费心(/有我真正应该做的工作)用例子、参考资料等来充实它。别担心,对某人来说不会花很长时间否则去做。 (不要觉得你必须接受一个不完整的答案,因为它是唯一的)。
  • @BoBTFish 复制省略在没有移动操作的情况下工作得很好。你能澄清一下吗?

标签: c++ rvo nrvo


【解决方案1】:

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

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

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


Sample code 演示 NRVO。

【讨论】:

    猜你喜欢
    • 2022-06-23
    • 2012-05-26
    • 2012-10-08
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2016-04-22
    相关资源
    最近更新 更多