高效的函子调度器

问题描述

我需要帮助理解两个不同版本的 functor dispatcher,请看这里:

#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) 在调度程序中创建函子的静态实例,但随后对象的生命周期增长到程序的生命周期。

话虽如此,我不知道足够的程序集来有意义地比较这两种方法。 有没有更优雅/更有效的方法?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)