[英]c++ combining function pointers with best possible performance
我想要一個描述 function 的類型,它允許通過組合現有函數來創建相同類型的新函數,如下所示:
FuncType f;
FuncType g;
FuncType h = f(g);
FuncType e = f + g;
我嘗試使用 function 指針並將 lambdas 分配給它們,如下所示:
typedef double(*FunPtr)(double);
double Fun1(double a) { return 2 * a; }
double Fun2(double a) { return a * a; }
int main{
auto Fun3 = [](double a){return -a;};
FuncType F1 = Fun1;
FuncType F2 = Fun2;
FuncType F3 = Fun3;
auto HFun = [](double a){return (*F1)(a);} // does not work, requires capturing F1
auto HFun = [F1](double a){return (*F1)(a);} // works
FunPtr H = HFun; //Does not work, I suppose because of capturing F1.
}
更換
typedef double(*FunPtr)(double);
和
typedef std::function FunPtr;
解決了這個問題,但是 function 調用將在非常大的嵌套循環中發生,因此性能可能是一個問題,我在這里和那里讀到使用 std::function 會帶來開銷。
1-與std :: function相比,有沒有辦法以具有更好性能的方式實現這一目標?
2-首先使用 function 指針有更好的性能嗎?
3- 哪個普通函數或 lambdas 是更好的選擇? (F3 對 F1)
非常感謝!
1-與std :: function相比,有沒有辦法以具有更好性能的方式實現這一目標?
std::function
非常靈活,但確實很慢。 為了如此靈活,它執行類型擦除,這是有代價的。 我猜想可能所有其他選項都比std::function
(總是基准測試)更快。
2-首先使用 function 指針有更好的性能嗎?
Function 指針非常直接,開銷應該可以忽略不計,但它們不是很靈活。
3- 哪個普通函數或 lambdas 是更好的選擇? (F3 對 F1)
Lambda 函數比 function 指針更容易使用,並且它們很有效。 但是每個 lambda function 都是“自己的類型”,這在您想要創建它們的數組時會造成困難。
Lambda 函數可以轉換為 function 指針,但前提是它們不捕獲,但您需要捕獲才能執行所需的f(g)
。 因此,在您的情況下,它們似乎不是一種選擇
我的建議是您嘗試繼續使用 function 指針,如果由於某種原因不能,則改用虛擬類。
過去我需要存儲函數數組,我開始使用std::function
數組,這被證明很慢。 最后,我更改為基本 class 指針數組,其中基本 class 具有純虛擬方法,實際 function 將在子類中實現。 基准測試表明,此解決方案比使用std::function
更快。 盡管虛擬方法也有一些開銷,但它比std::function
中的開銷要少。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.