c++ - C++11 中的递归 lambda 实现

标签 c++ c++11 lambda

我对递归 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 未再次分配,编译器可能会在初始化后立即存储值而不是引用。但这并不能保证,甚至不太可能。

关于c++ - C++11 中的递归 lambda 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17834512/

相关文章:

c++ - 您将如何在 C++11 中实现自己的读/写锁?

c++ - 添加到 vector 后在析构函数内部双重释放

c++ - std::unique_ptr 在其拥有的对象被手动删除后超出范围时如何工作?

c++ - x 时间后如何中止 Winsock 连接

c# - 如何在 lambda 表达式中组合多个语句

Java 8 : Do not understand the way Java implements Functional Interfaces

c# - 将此 LINQ 表达式转换为 Lambda

java - 如何将 Java double[][] 转换为 C++ <vector<vector>> JNI?

c++ - 将字符串存储在数组中以在 IF 语句中使用的可能方法

c++ - 非 ASCII 字符 - 从 std::string 到 char* 的转换