c++11中的递归lambda实现

recursive lambda implemention in c++11

本文关键字:lambda 实现 递归 c++11      更新时间:2023-10-16

我对递归lambda实现感兴趣,并找到了用于Fibonacci计算的代码:

 std::function<int(int)> lfib = [&lfib](int n) {return n < 2 ? 1 : lfib(n-1) + lfib(n-2);};

我有一个问题:std::function是一个多态函数,所以lfib在堆内存中创建/并保存lambda,而不是在堆栈中。因此,可能会失去程序的优化可能性。正确与否?

类型擦除数据是std::function的状态,它将在std::function或其副本存在期间持续存在,可能通过堆分配。

闭包的情况并非如此,它包含捕获的变量。这是lambda对象状态的一部分,可能包含堆栈上数据结构的地址,当当前函数返回并且变量lfib超出范围时,该地址将消失。

请记住,您已经通过引用捕获了lfib。因此,函数其余部分对lfib的任何更改都必须对lambda可见(包括但不限于初始化)。编译器能够以通用方式管理它的唯一方法是存储本地lfib的地址。在您的特定情况下,如果没有再次分配lfib,编译器可能会在初始化后立即存储值,而不是引用。但这并不能保证,甚至不太可能。