“返回值优化”的概念是否适用于C++编译器中的lambda表达式?我知道这取决于编译器和优化参数,但理论上可行吗?
顺便说一句,在2013年的VS.NET或更高版本中,有人知道这个问题吗?
发布于 2015-10-19 10:57:30
是的,这是可能的。你可以用一个小例子来证明这一点。
下面的代码产生了这个输出,当我用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可以帮助您。
发布于 2015-10-19 11:02:55
但理论上有可能吗?
我看不出有什么理由不。lamda的是在运行编译时生成的带有()操作符重载的结构.
这意味着:
auto f = []{printf("hi");};可能会被翻译成
struct lambda<someID>{ void operator(){printf("hi");} };
auto f = lambda<someID>();因此,如果编译器认为RVO可以优化,那么RVO就没有理由不能在这里工作。
https://stackoverflow.com/questions/33212302
复制相似问题