[英]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.