首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lambda表达式和RVO

Lambda表达式和RVO
EN

Stack Overflow用户
提问于 2015-10-19 10:38:32
回答 2查看 532关注 0票数 1

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-19 10:57:30

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

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

克托尔

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

代码语言:javascript
复制
#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可以帮助您。

票数 4
EN

Stack Overflow用户

发布于 2015-10-19 11:02:55

但理论上有可能吗?

我看不出有什么理由不。lamda的是在运行编译时生成的带有()操作符重载的结构.

这意味着:

代码语言:javascript
复制
auto f = []{printf("hi");};

可能会被翻译成

代码语言:javascript
复制
struct lambda<someID>{  void operator(){printf("hi");}  };
auto f = lambda<someID>();

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33212302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档