我想有一个描述函数的类型,允许通过组合现有的函数来创建相同类型的新函数,就像这样。
FuncType f;
FuncType g;
FuncType h = f(g);
FuncType e = f + g;
我试过使用函数指针并给它们分配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;
解决了这个问题,但是函数的调用会发生在非常大的嵌套循环中,因此性能可能是个问题,而且我在这里和那里读到使用std::function会有一个开销。
1- 有没有一种方法可以使这种方法比std::function有更好的性能?
2- 首先使用函数指针是否有更好的性能?
3- 普通函数和lambdas哪个是更好的开始选择?(F3与F1)
非常感谢!我想有一个描述函数的类型,允许通过合并现有函数来创建相同类型的新函数,就像这样:
1- 有没有一种方法可以使这种方法比std::function有更好的性能?
std::function
是非常灵活的,但它确实很慢。为了做到如此灵活,它要进行类型擦除,这是有代价的。我猜想,可能所有其他选项都比 std::function
总是基准)。
2- 使用函数指针是否有更好的性能在先?
函数指针非常直接,开销应该可以忽略不计,但灵活性不高。
3- 首先普通函数和lambdas哪个更好?(F3与F1)
Lambda函数比函数指针更容易使用,而且效率高。但是每个Lambda函数都是 "自己的类型",当你想创建一个数组时,就会产生困难。
兰姆达函数可以转换为函数指针,但是...。除非他们没有抓住但你需要捕捉做 f(g)
你想要的。因此,在你的情况下,他们似乎不是一个选择。
我的建议是,你尽量继续使用函数指针,如果因为某些原因不能使用,那就改用虚拟类。
过去我需要存储一个函数数组,于是我开始使用一个由 std::function
这被证明是很慢的。最后,我改成了基类指针数组,基类有一个纯虚拟方法,实际功能要在子类中实现。基准测试表明,这个解决方案比使用 "虚拟方法 "更快。std::function
. 尽管虚拟方法也有一些开销,但它比虚拟方法的开销要小。std::function
.