减少非静态成员函数的开销

时间:2019-05-03 23:25:26

标签: c++ performance inlining

我有一个计算物理代码(有限差分),它对大数据数组(解字段和系数字段)执行操作(导数)。 系数数据使用重载的Model运算符存储为()个对象的数组。 以下课程是我要尝试做的一个示例:

class Model
{
public: 
    inline double operator () (double field)
    {
        return alpha*field;
    }
private:
double alpha ;
}

应用程序将使用Models数组:

std::vector<Model> models; // array of models
std::vector<double> input;
std::vector<double> output;
...    
for (int i = 0; i < models.size(); i++)
{
    output[i] = models[i](input[i]);
} 

问题是使用()运算符会产生大量开销。

我已经按原样分析了代码,然后再次删除了()运算符并内联编写了代码。 (我正在使用在Ubuntu 18.04上运行的g ++ 7.3.0。)。我正在使用-Winline进行编译,而g ++并没有抱怨它不能内联函数。

我还尝试过使用static函数代替()运算符,但是开销并不相同。不幸的是,静态函数无法访问成员变量。其他帖子指出这应该不是问题(例如C++ Non-static member functions overhead),但似乎确实存在。

所以我的问题是:这个非静态成员函数的开销来自哪里?

1 个答案:

答案 0 :(得分:0)

静态和非静态之间的区别是this指针。该代码在所有实例之间共享,但是该函数有一个隐式参数来访问该类的成员。因此,没有像您所提到的问题那样的内存开销,但是由于传递this以及指针取消引用以访问成员变量,因此在时间上花费很少。您可以检查生成的程序集文件以确保其内联。

建议加快执行速度:

  • 使用编译器优化
  • 使用并行性:C ++线程或OpenMP是此处的简单选项
  • 将您的设计更改为使用alpha的向量并删除该类,然后就可以使用SIMD