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

问题描述 投票:1回答:1

我想有一个描述函数的类型,允许通过组合现有的函数来创建相同类型的新函数,就像这样。

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)

非常感谢!我想有一个描述函数的类型,允许通过合并现有函数来创建相同类型的新函数,就像这样:

c++ lambda function-pointers std-function
1个回答
0
投票

1- 有没有一种方法可以使这种方法比std::function有更好的性能?

std::function 是非常灵活的,但它确实很慢。为了做到如此灵活,它要进行类型擦除,这是有代价的。我猜想,可能所有其他选项都比 std::function 总是基准)。

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

函数指针非常直接,开销应该可以忽略不计,但灵活性不高。

3- 首先普通函数和lambdas哪个更好?(F3与F1)

Lambda函数比函数指针更容易使用,而且效率高。但是每个Lambda函数都是 "自己的类型",当你想创建一个数组时,就会产生困难。

兰姆达函数可以转换为函数指针,但是...。除非他们没有抓住但你需要捕捉做 f(g) 你想要的。因此,在你的情况下,他们似乎不是一个选择。

我的建议是,你尽量继续使用函数指针,如果因为某些原因不能使用,那就改用虚拟类。


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

© www.soinside.com 2019 - 2024. All rights reserved.