2013-07-24 59 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