gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:32:20 28 4
gpt4 key购买 nike

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

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- Is there a way to make this possible in a way that has a better performance compared to std::function?


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

2- Does using function pointers have a better performance in the first place?



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

3- Which of normal functions or lambdas is a better choice to start with? (F3 vs F1)



Lambda 函数比函数指针更容易使用,而且效率很高。但是每个 lambda 函数都是“自己的类型”,这在您想要创建它们的数组时会造成困难。

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

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

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

关于c++ 将函数指针与最佳性能相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61801584/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com