gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:39:05 29 4
gpt4 key购买 nike

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

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&);
}

在典型的运行过程中,此函数将被调用大约 108 次。

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

我已阅读 this :

(std::function) ... has the disadvantage of introducing some (very small) overhead when being called (so in a very performance-critical situation it might be a problem but in most it should not)

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

编辑

似乎有点困惑。需要说明的是,函数 u 在可执行文件的编译时是已知的,但在库的编译时是未知的。在运行时获取函数是我将在库的更高版本中考虑的功能,但不是现在。

最佳答案

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

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

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

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

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

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

关于c++ - 比函数引用更有效的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29856081/

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