[英]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
和访问成员变量的指针取消引用,时间成本很小。 您可以检查生成的程序集文件以确保它是内联的。
加速执行的建议:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.