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

Eli*_*iad 8 c++ performance reference class c++11

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

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&);
}
Run Code Online (Sandbox Code Playgroud)

该功能将被称为像10周8典型的运行过程中的时间.

该类进入库,该函数u由库的用户定义.所以我不能在类中有函数定义.

我读过这个:

(std::function)...的缺点是在被调用时引入一些(非常小的)开销(所以在一个非常严重的性能问题上它可能是一个问题,但在大多数情况下它不应该)

有没有更有效的方法将函数传递u给类equation?这会被视为"一个非常严重的性能危机"吗?

编辑

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

Ben*_*igt 4

函数指针(或引用,在实现级别几乎相同)就可以很好地工作。

现代CPU非常擅长分支预测,在前几次调用之后,CPU将认识到这个“间接”调用总是去同一个地方,并使用推测执行来保持管道满载。

然而,仍然不会有跨功能边界的优化。没有内联,没有自动矢量化。

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

(这是通过减少跨边界调用次数来处理互操作成本的一般原则的具体情况)

如果这是不可能的,那么请按值传递参数。正如其他人所说,这比浮点变量的 const 引用最有效。可能效率更高,因为大多数调用约定将使用浮点寄存器(通常是现代 Intel 架构上的 SSE 寄存器,在此之前它们使用 x87 堆栈),以便立即执行计算。为了通过引用传递而将值溢出到 RAM 或从 RAM 溢出是相当昂贵的,当函数被内联时,通过引用传递就会被优化掉,但这不会发生在这里。但这仍然不如传递整个数组好。