繁体   English   中英

C ++ 11中的递归lambda实现

[英]recursive lambda implemention in c++11

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM