我感兴趣的递归拉姆达实施,并找到了斐波那契数计算验证码:递归拉姆达FPGA实现++ 11
std::function<int(int)> lfib = [&lfib](int n) {return n < 2 ? 1 : lfib(n-1) + lfib(n-2);};
而且我有一个问题:std::function
是一个多态函数,所以lfib
创建和/将lambda保存在堆内存中,而不是堆栈中。因此可能会失去该程序的优化可能性。正确与否?
我感兴趣的递归拉姆达实施,并找到了斐波那契数计算验证码:递归拉姆达FPGA实现++ 11
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
没有再次分配,编译器可能会立即在初始化后存储该值,而不是参考。但它不能保证,甚至不是特别可能。
是的。不,也许。 –
对于O(2^N)算法复杂度的程序,函数调用的机制并不重要。 – Cubbi
我没有问过关于执行fibbonachi,我被问到有关std :: function可能会丢失优化的程序。 –