我有一个计算物理代码(有限差分),它对大数据数组(解字段和系数字段)执行操作(导数)。
系数数据使用重载的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),但似乎确实存在。
所以我的问题是:这个非静态成员函数的开销来自哪里?
答案 0 :(得分:0)
静态和非静态之间的区别是this
指针。该代码在所有实例之间共享,但是该函数有一个隐式参数来访问该类的成员。因此,没有像您所提到的问题那样的内存开销,但是由于传递this
以及指针取消引用以访问成员变量,因此在时间上花费很少。您可以检查生成的程序集文件以确保其内联。
建议加快执行速度: