c ++ 11中的递归lambda实现

Khu*_*dov 8 c++ lambda c++11

我有兴趣递归lambda实现,并发现此代码用于Fibonacci计算:

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

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

Ben*_*igt 5

类型擦除数据是状态,std::function只要它std::function或它的副本存在就会持续存在,可能是通过堆分配.

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

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