8

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

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

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

4

1 回答 1

5

std::function只要std::function或它的副本存在,作为状态的类型擦除数据将持续存在,可能通过堆分配。

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

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

于 2013-07-24T12:53:40.933 回答