2015-10-17 96 views
2

我要問,如果使用這種模式是一個很好的做法或不:計算,如果首次加載如果第二次圖案

我有一個包含一些原始數據的類。我想從這些數據中得出一些信息,例如:

class my_class{ 
public: 
    int get_integers_sum(); 
private: 
    std::vector<int> all_integers; 
}; 

假設all_integers不會被改變。這是否是一件好事:

class my_class{ 
    public: 
     int get_integers_sum(){ 
      if(sum==-1){ 
       sum=sum=std::acculmate(all_integeres);// the proper code ofcourse 
      } 

      return sum; 
     } 
    private: 
     std::vector<int> all_integers; 
     int sum=-1; 
}; 

回答

1

這是一個有用的模式,當你知道輸入不會改變。這種方法的通用名稱是memoization。你的實現有點缺陷,因爲all_integers的總和實際上可能是-1。

+0

關於-1它只是一個例子...謝謝:) –

1

測量它並找出;從來沒有嘗試優化沒有測量。請記住,在現代CPU上,計算速度很快,內存訪問速度很慢,所以答案可能不符合您的期望。

這就是您擔心多個線程安全地調用此代碼之前。

1

據我所知,這種類型的緩存方法很好。當你知道get_integers_sum()被經常調用時,它基本上是有意義的,但是all_integers很少會改變。 但你應該保持const正確性,這是可以使用mutable的情況之一。

class my_class{ 
public: 
    int get_integers_sum() const { // <- adding const 
     if(sum==-1){ 
      sum=std::acculmate(all_integeres); 
     } 

     return sum; 
    } 
private: 
    std::vector<int> all_integers; 
    mutable int sum=-1; // <- adding mutable so it can be changed in const function 
}; 
相關問題