我感興趣的遞歸拉姆達實施,並找到了斐波那契數計算驗證碼:遞歸拉姆達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可能會丟失優化的程序。 –