gpt4 book ai didi

c++ - 嵌套 Lambda 函数 - 性能影响

转载 作者:可可西里 更新时间:2023-11-01 16:34:15 26 4
gpt4 key购买 nike

我有一个顶级 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com