我有一个顶级 lambda 函数,然后在这个 lambda 中有几个嵌套的 lambda 函数。
将 lambda 嵌套在其他 lambda 中是个好主意吗?对性能有影响吗?
例如
auto Multiplier1 = []() -> int
{
auto Multiplier2 = [](int i) -> int
{
auto Multiplier3 = [](int i) -> int
{
return i * 2;
};
std::cout << "Calling another lambda 2\n";
return Multiplier3(i * 100);
};
int i = 10;
std::cout << "Calling another lambda 1\n";
int ret = Multiplier2(i);
return ret;
};
int ret = Multiplier1();
std::cout << ret << "\n";
在上面的示例中,我可以将 Multiplier2 和 Multiplier3 重构为单独的函数。与此相比,这是更好的方法吗?
我正在修改已经在生产中的代码,因此,我进退两难,是将其重构为单独的函数还是使用 lambda 函数进行管理。
最佳答案
由于编码风格的表达而询问性能影响总是错误的问题。
编译器在优化时会考虑表达的意图,而不是代码的布局。
这个例子很极端,但值得向您展示 gcc 使用编译器选项 -O2
生成的代码。
重构上面的代码以消除使用 cout
产生的噪音:
auto Multiplier1 = []() -> int
{
auto Multiplier2 = [](int i) -> int
{
auto Multiplier3 = [](int i) -> int
{
return i * 2;
};
return Multiplier3(i * 100);
};
int i = 10;
int ret = Multiplier2(i);
return ret;
};
extern void emit(int);
int main()
{
int ret = Multiplier1();
emit(ret);
}
用 gcc -S -O2 -std=c++14
编译产生:
main:
subq $8, %rsp
movl $2000, %edi
call emit(int)
xorl %eax, %eax
addq $8, %rsp
ret
请注意,优化器已经看穿了所有代码,并意识到这段代码可能采取的唯一行动(重要的)是使用参数值 2000 调用函数 emit
。
教训始终是人们应该优雅地表达意图(即以一种易于理解和维护的方式)并允许编译器完成其工作,以最短的时间和/或代码大小发出实现该意图的代码.
关于c++ - 嵌套 Lambda 函数 - 性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37475962/