我需要帮助理解函子调度程序的两个不同版本,请参见此处:
#include <cmath>
#include <complex>
double* psi;
double dx = 0.1;
int range;
struct A
{
double operator()(int x) const
{
return dx* (double)x*x;
}
};
template <typename T>
void dispatchA()
{
constexpr T op{};
for (int i=0; i<range; i++)
psi[i]+=op.operator()(i);
}
template <typename T>
void dispatchB(T op)
{
for (int i=0; i<range; i++)
psi[i]+=op.operator()(i);
}
int main(int argc, char** argv)
{
range= argc;
psi = new double[range];
dispatchA<A>();
// dispatchB<A>(A{});
}
住在https://godbolt.org/z/93h5T46oq
调度程序会在一个大循环中被多次调用,所以我需要确保我做对了。在我看来,这两个版本都不必要地复杂,因为函子的类型在编译时是已知的。DispatchA,因为它不必要地创建了一个 (constexpr) 对象。DispatchB,因为它一遍又一遍地传递对象。
当然,这些可以通过 a) 在函子中创建一个静态函数来解决,但是静态函数是不好的做法,对吧?b) 在调度程序中创建函子的静态实例,但随后对象的生命周期会增长到程序的生命周期。
话虽这么说,我不知道足够的组装来有意义地比较这两种方法。有没有更优雅/更有效的方法?