Lambda 表达式和 RVO
Lambda expressions and RVO
"Return Value Optimization" 的概念是否适用于 C++ 编译器中的 lambda 表达式?我知道这取决于编译器和优化参数,但理论上可能吗?
顺便说一句,有人知道 VS.NET 2013 年或更高版本的这个问题吗?
是的,这是可能的。你可以用一个小例子来证明。
当我使用带有 -O2
选项的 clang 和 g++ 编译时,以下代码产生了这个输出:
Ctor
所以,"copy"没有打印出来。这意味着 NO 复制发生了。
#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 适用于函数的 return 值。 lambda 被编译为函子。所以,它仍然是一个函数。
为什么在VS里不行,这个post或许可以帮到你
but is it theoretical possible?
我看不出有什么理由不这样做。 lamda 是即时编译时生成的结构,()
运算符重载。
意思是:
auto f = []{printf("hi");};
可能会被翻译成
struct lambda<someID>{ void operator(){printf("hi");} };
auto f = lambda<someID>();
因此,如果编译器认为 RVO 可以进行优化,那么 RVO 没有理由不能在这里工作。
"Return Value Optimization" 的概念是否适用于 C++ 编译器中的 lambda 表达式?我知道这取决于编译器和优化参数,但理论上可能吗?
顺便说一句,有人知道 VS.NET 2013 年或更高版本的这个问题吗?
是的,这是可能的。你可以用一个小例子来证明。
当我使用带有 -O2
选项的 clang 和 g++ 编译时,以下代码产生了这个输出:
Ctor
所以,"copy"没有打印出来。这意味着 NO 复制发生了。
#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 适用于函数的 return 值。 lambda 被编译为函子。所以,它仍然是一个函数。
为什么在VS里不行,这个post或许可以帮到你
but is it theoretical possible?
我看不出有什么理由不这样做。 lamda 是即时编译时生成的结构,()
运算符重载。
意思是:
auto f = []{printf("hi");};
可能会被翻译成
struct lambda<someID>{ void operator(){printf("hi");} };
auto f = lambda<someID>();
因此,如果编译器认为 RVO 可以进行优化,那么 RVO 没有理由不能在这里工作。