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