【问题标题】:Lambda expressions and RVOLambda 表达式和 RVO
【发布时间】:2016-01-17 16:12:28
【问题描述】:

“返回值优化”的概念是否适用于 C++ 编译器中的 lambda 表达式?我知道这取决于编译器和优化参数,但理论上可行吗?

顺便说一句,有人知道 VS.NET 2013 或更高版本中的这个问题吗?

【问题讨论】:

标签: c++ c++11 lambda rvo


【解决方案1】:

是的,这是可能的。你可以用一个小例子来证明。

当我使用 clang 和 g++ 以及 -O2 选项编译时,以下代码产生了这个输出:

导演

所以,“副本”没有打印出来。这意味着没有复制发生。

#include <iostream>

class Test
{
public:
    Test() { std::cout << "Ctor\n";}
    Test(const Test& t) 
    {
        std::cout << "copy" << std::endl;
    }
};

int main()
{    
    auto myLambda = []() 
    {
        return Test();
    };

    Test t = myLambda(); 
}

RVO 适用于函数的返回值。 lambda 被编译为仿函数。所以,它仍然是一个函数。

至于为什么它在VS中不起作用,也许这个post可以帮助你。

【讨论】:

  • 对不起,我没听懂你……你是如何通过这个例子确定它被应用的?
  • 复制构造函数不只调用构造函数。所以没有复制。
  • 为了有意义,这样的代码可能应该对t 做一些事情,这样整个程序就不会被优化为一无所有。在我的情况下,g++ 不是,添加成员 int a{4}cout &lt;&lt; t.a 也没有任何区别,所以我可以确认你的结果......但是,当我们'正在衡量优化,我们应该始终采取措施确保其他优化不会使我们的衡量变得毫无意义! ;-)
【解决方案2】:

但理论上可行吗?

我看不出有什么理由不这样做。 lamda 是即时编译时生成的结构,其中 () 运算符重载。

意思是:

auto f = []{printf("hi");};

可能会被翻译成

struct lambda<someID>{  void operator(){printf("hi");}  };
auto f = lambda<someID>();

所以,如果编译器认为 RVO 可以优化,那么没有理由不在这里工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2017-07-04
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多