2013-07-24 60 views
8

我感兴趣的递归拉姆达实施,并找到了斐波那契数计算验证码:递归拉姆达FPGA实现++ 11

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

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

+4

是的。不,也许。 –

+8

对于O(2^N)算法复杂度的程序,函数调用的机制并不重要。 – Cubbi

+0

我没有问过关于执行fibbonachi,我被问到有关std :: function可能会丢失优化的程序。 –

回答

5

只要std::function或其拷贝存在,类型擦除数据即std::function的状态将持续存在,可能通过堆分配。

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

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

+1

这样一个小的lambda可能会在小缓冲区中结束优化并不会导致任何堆分配。 – Xeo

+0

@Xeo:很可能。我不是'std :: function'实现方面的专家。这里最感兴趣的是一生。 –

+0

@Xeo:不在libstdC++中,由于某些原因,lambdas从不直接存储在'std :: function'本身,因为它们不被认为是“位置不变”。请参阅'std :: _ Function_base :: _ Base_manager :: __ stored_locally'。 – Fanael