C++ 将函数指针与最佳性能相结合
c++ combining function pointers with best possible performance
我想要一个描述函数的类型,该函数允许通过组合现有函数来创建相同类型的新函数,如下所示:
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
中的开销。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C#中处理C++指针而不使用unsafe的最佳方法
- OpenMP阵列性能较差
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 递归列出所有目录中的C++与Python与Ruby的性能
- 在c代码之间共享数据的最佳方式
- C++ 将函数指针与最佳性能相结合
- 从 {fmt} 获得最佳性能
- 只在模板中专门化构造函数,保持最佳性能和整洁的界面
- C 初始化列表std ::数组最佳性能
- 具有任意基数的基本任意精度算术的最佳性能
- C# 与 C/C++:我是否需要手动对结构字段进行排序以获得最佳性能
- 为什么缓冲区应该在 64 字节边界上对齐以获得最佳性能
- Getter & Setter 的最佳性能
- 排序列表的最佳数据结构(性能)
- 查找仅在性能测试下发生的堆损坏的最佳方法是什么?
- 在保持良好的面向对象设计的同时重用代码以提高性能的最佳方法是什么?
- 如何将 Argb32 加载到特征矩阵中以获得最佳性能
- 测试值是否在阈值范围内的最佳方法(性能方面)是什么