比函数引用更有效的方法?

埃里亚德

我有一个使用对函数的引用的类:

double u( const double& x, const double& y )
{
  return x * y;
}

class equation
{
  equation( double (&in_u)(const double&, const double&) );
//...
protected:
  double (&u)(const double&, const double&);
}

在典型的运行过程中,此函数将被称为10 8次。

该类进入一个库,函数u由库的用户定义。所以我不能在类内部具有函数定义。

我读过这个

std::function)...的缺点是在被调用时会引入一些(非常小的)开销(因此,在性能非常关键的情况下,这可能是个问题,但在大多数情况下不应该这样)

有没有更有效的方法将函数传递u给类equation这是否算作“非常关键的情况”?

编辑

似乎有些混乱。只是要清楚,该功能u 在可执行文件编译时已知,但不是在图书馆的。我将在库的更高版本中考虑在运行时获取该功能,但现在不考虑。

本·沃格特

函数指针(或引用,在实现级别上几乎相同)可以正常工作。

现代的CPU非常擅长分支预测,在第一次调用之后,CPU会认识到此“间接”调用总是到达同一位置,并使用推测执行来保持管道满载。

但是,跨功能边界仍然没有优化。没有内联,没有自动向量化。

如果此函数被调用10 8次,则可能其中许多函数处于紧密循环且参数变化。在这种情况下,我建议更改函数原型以接受参数值数组并输出结果数组。然后在函数内部循环,编译器可以在其中执行优化,例如展开和自动矢量化。

(这是通过减少跨越边界的呼叫数量来处理互操作成本的一般原则的特定情况)

如果不可能,那么请按值传递参数。正如其他人所说,对于浮点变量,这比const引用最有效。可能是很多更有效,因为大多数的调用约定将使用浮点寄存器(通常是SSE寄存器,对现代英特尔架构,他们用x87堆栈之前)他们准备立即执行计算其中。为了通过引用传递值到RAM或从RAM溢出值是非常昂贵的,当内联函数时,将优化传递引用,但是这种情况不会在这里发生。但是,这仍然不如传递整个数组好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

编写jQuery函数的更有效方法

来自分类Dev

编写jQuery函数的更有效方法

来自分类Dev

使简单的jQuery函数更有效

来自分类Dev

使简单的jQuery函数更有效

来自分类Dev

通过引用将变量传递给函数是否比使函数返回变量更有效?

来自分类Dev

有更有效的方法吗?

来自分类Dev

列出组合的更有效方法

来自分类Dev

选择功能的更有效方法

来自分类Dev

更有效的迭代方法

来自分类Dev

制作JButton的更有效方法

来自分类Dev

Django注释-更有效的方法?

来自分类Dev

创建阵列的更有效方法

来自分类Dev

列出组合的更有效方法

来自分类Dev

复制代码的更有效方法

来自分类Dev

跳过csv中的列到namedtuple函数的更有效方法?

来自分类Dev

在vim中注释掉这两个函数的更有效方法

来自分类Dev

JavaScript:它可以工作,但是编写此函数的更有效方法是什么?

来自分类Dev

编写按字典顺序添加新元素的链接函数的更短/更有效的方法

来自分类Dev

如何使此递归函数更有效?

来自分类Dev

如何使此PHP函数在规模上更有效?

来自分类Dev

Vue JS-使函数中的条件更有效

来自分类Dev

哪个代码更有效?(调用javascript函数。)

来自分类Dev

警告在子类中使用更有效的函数

来自分类Dev

哪个更有效?

来自分类Dev

使循环更有效

来自分类Dev

更有效的循环

来自分类Dev

使循环更有效

来自分类Dev

比{{}}更有效的在模板中调用Angular方法的方法?

来自分类Dev

有没有更有效的方法使用递归函数检查数字是否为质数?