繁体   English   中英

减少非静态成员函数开销

[英]Reducing non-static member function overhead

我有一个计算物理代码(有限差分),它对大型数据数组(解域和系数域)执行操作(导数)。 系数数据存储为具有重载()运算符的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]);
} 

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

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

我还尝试使用static函数代替()运算符,并且没有相同的开销。 不幸的是,静态函数无法访问成员变量。 其他帖子表明这应该不是问题(例如C++ 非静态成员函数开销),但它似乎确实存在。

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

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

加速执行的建议:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM