我有一个使用对函数的引用的类:
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] 删除。
我来说两句