2015-07-02 60 views
-2

我想做單身人士的行爲如下。單身人士的懶惰初始化問題

  1. 我的程序資源非常有限,所以我不想讓singleton實例直到我需要它。 (延遲初始化)
  2. 單例類非常大,所以初始化需要很長時間。
  3. 響應時間是在這個方案非常重要。(如遊戲)

但你也知道,1 3是互相沖突。 在這種情況下,我必須選擇其中的一種(內存或性能)

有什麼解決方案可以滿足程序內存&的性能要求嗎?

+0

最直接的答案似乎是:_不要使用SINGLETONS_(除非你100%確定你在做什麼)。 –

+0

在程序執行過程中,您是否需要單例程序,或者程序可能不需要它用於給定的運行?如果它是前者,那麼你最好在開始時初始化它,因爲內存和CPU在某個時候會很受歡迎,所以我認爲隱藏它的最佳位置是在啓動時,而不是執行該程序的一半。 – Sam

回答

0

「有沒有解決方案可以滿足內存&性能要求?」

無論如何需要滿足這些要求。爲了確保單個類的延遲實例,如前所述here我會建議使用斯科特·邁爾的單執行,以保證懶/線程安全初始化:

class Singleton { 
public: 
    static Singleton& Instance() { 
      static Singleton theInstance; 
      return theInstance; 
    } 
    delete Singleton(const Singleton&); 
    delete Singleton& operator=(const Singleton&); 
private: 
    Singleton() {} 

}; 

關於內存消耗,你必須優化它以不同的方式。我實際上不知道,你可能有潛力縮小你的內存佔用。到目前爲止您的問題沒有足夠的信息。


「但你也知道,1 3是相互衝突的。在這種情況下,我必須選擇其中之一(內存或性能)」

我看不到任何實際的衝突?在第一次訪問Singleton::Instance時可能會出現性能問題,但隨後的訪問不會觸發初始化,那又如何?

-2

這很難說,因爲你沒有給出很多details.Are你的資源有限的內存和磁盤?單例類需要時間來初始化,因爲它很大,或者因爲它需要做很多計算?很久很久了?多少是巨大的?什麼是有限的資源?

如果你的磁盤空間,如果讀/寫盤是比較快的, ,如果你可以在你的程序中, 的初始化過程中花一些時間也許你可以創建並序列類到磁盤(並保持文件 鎖定),然後在需要時從內部讀取實例,如果內存不足的話。或者在另一個線程中創建單例,並在主線程中執行一些其他的東西。

+0

這並沒有真正回答這個問題。請閱讀_Singleton_,如果你甚至在這裏嘗試回答這樣的問題。 –

+0

有沒有解決方案可以滿足內存和性能要求的程序? –

+0

有很多選項,實際上是正交處理的,與單獨使用無關。 –