c++11中的递归lambda实现
recursive lambda implemention in c++11
我对递归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
,编译器可能会在初始化后立即存储值,而不是引用。但这并不能保证,甚至不太可能。
相关文章:
- 如果没有malloc,链表实现将失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 在实现文件中使用头文件的通用 lambda
- 它是否定义了哪些算法可以接受可变 lambda 的实现?
- C++:实现一个接收lambda作为输入的高阶函数
- 模板函数中的无捕获 lambda 是否具有多个二进制实现?
- 没有捕获列表的 lambda 通常作为普通函数实现吗?
- 在C 11或更高版本中,是否可以通过Lambda来实现单方法纯Virtual C 接口
- 如何在不使用 lambda 表达式的情况下实现特定的比较器
- 如何为涉及对象成员、间接寻址和强制转换的排序算法实现lambda函数
- 为什么C++lambda是用函子而不是函数指针实现的
- 运行时的C++lambda实现
- c++11中的递归lambda实现
- 使用C++lambda正确实现finally块
- 使用boost实现c++ 11 lambda
- 在c++ 11中实现干净的lambda函数
- 自动推导在作为 Lambda 实现时不起作用。错误:扣除'auto'之前