簡體   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