簡體   English   中英

c++ 結合了具有最佳性能的 function 指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM