1

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

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

4

2 回答 2

4

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

当我使用 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中不起作用,也许这篇文章可以帮助你。

于 2015-10-19T10:57:30.730 回答
0

但理论上可行吗?

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

这意味着:

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

可能会被翻译成

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

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

于 2015-10-19T11:02:55.357 回答