我对递归lambda实现感兴趣,并找到了用于斐波那契计算的代码:
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
,则编译器可能会在初始化后立即存储值,而不是引用。但这并不能保证,甚至不可能。