我想做單身人士的行爲如下。單身人士的懶惰初始化問題
- 我的程序資源非常有限,所以我不想讓singleton實例直到我需要它。 (延遲初始化)
- 單例類非常大,所以初始化需要很長時間。
- 響應時間是在這個方案非常重要。(如遊戲)
但你也知道,1 3是互相沖突。 在這種情況下,我必須選擇其中的一種(內存或性能)
有什麼解決方案可以滿足程序內存&的性能要求嗎?
我想做單身人士的行爲如下。單身人士的懶惰初始化問題
但你也知道,1 3是互相沖突。 在這種情況下,我必須選擇其中的一種(內存或性能)
有什麼解決方案可以滿足程序內存&的性能要求嗎?
「有沒有解決方案可以滿足內存&性能要求?」
無論如何需要滿足這些要求。爲了確保單個類的延遲實例,如前所述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
時可能會出現性能問題,但隨後的訪問不會觸發初始化,那又如何?
這很難說,因爲你沒有給出很多details.Are你的資源有限的內存和磁盤?單例類需要時間來初始化,因爲它很大,或者因爲它需要做很多計算?很久很久了?多少是巨大的?什麼是有限的資源?
如果你的磁盤空間,如果讀/寫盤是比較快的, ,如果你可以在你的程序中, 的初始化過程中花一些時間也許你可以創建並序列類到磁盤(並保持文件 鎖定),然後在需要時從內部讀取實例,如果內存不足的話。或者在另一個線程中創建單例,並在主線程中執行一些其他的東西。
這並沒有真正回答這個問題。請閱讀_Singleton_,如果你甚至在這裏嘗試回答這樣的問題。 –
有沒有解決方案可以滿足內存和性能要求的程序? –
有很多選項,實際上是正交處理的,與單獨使用無關。 –
最直接的答案似乎是:_不要使用SINGLETONS_(除非你100%確定你在做什麼)。 –
在程序執行過程中,您是否需要單例程序,或者程序可能不需要它用於給定的運行?如果它是前者,那麼你最好在開始時初始化它,因爲內存和CPU在某個時候會很受歡迎,所以我認爲隱藏它的最佳位置是在啓動時,而不是執行該程序的一半。 – Sam