C++ 将函数指针与最佳性能相结合

c++ combining function pointers with best possible performance

本文关键字:最佳 性能 相结合 指针 函数 C++      更新时间:2023-10-16

我想要一个描述函数的类型,该函数允许通过组合现有函数来创建相同类型的新函数,如下所示:

FuncType f;
FuncType g;
FuncType h = f(g);
FuncType e = f + g;

我尝试了使用函数指针并为它们分配 lambda,如下所示:

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;

解决了这个问题,但是函数调用将发生在非常大的嵌套循环中,因此性能可能是一个问题,我在这里和那里读到使用 std::function 会带来开销。

1-有没有办法使这成为可能,与std::function相比具有更好的性能?

2-首先使用函数指针是否有更好的性能?

3-从哪个正常函数或lambda开始是更好的选择?(F3 与 F1(

多谢!

1-有没有办法使这成为可能,与std::function相比,它具有更好的性能?

std::function非常灵活,但确实很慢。为了如此灵活,它执行类型擦除,这是有代价的。我猜可能所有其他选项都比std::function快(始终是基准测试(。

2-首先使用函数指针是否有更好的性能?

函数指针非常直接,开销应该可以忽略不计,但它们不是很灵活。

3-从哪个正常函数或lambda开始是更好的选择?(F3 与 F1(

Lambda 函数比函数指针更易于使用,而且效率很高。但是每个 lambda 函数都是"自己的类型",当您想要创建它们的数组时,这会导致困难。

Lambda 函数可以转换为函数指针,但前提是它们不捕获,但您需要捕获才能执行所需的f(g)。因此,在您的情况下,它们似乎不是一种选择

我的建议是尝试继续使用函数指针,如果由于某种原因不能,请更改为使用虚拟类。


过去,我需要存储一系列函数,我开始使用一系列std::function但事实证明这很慢。最后,我改用了一个基类指针数组,其中基类有一个纯虚拟方法,实际函数要在子类中实现。基准测试表明,该解决方案比使用std::function更快。尽管虚拟方法也有一些开销,但它小于std::function中的开销。