2016-03-12 46 views
1

我有一個Singleton實現,我不確定它包含哪些缺點。有誰能告訴我這個實現有多好?帶有靜態成員實例的單身人士

template <class Child> 
class Singleton { 

public: 

    inline static Child& Instance() { 
     return Instance_; 
    } 

    Singleton(const Singleton&) = delete; 
    Singleton(Singleton&&) = delete; 

    Singleton& operator=(const Singleton&) = delete; 
    Singleton& operator=(Singleton&&) = delete; 

protected: 

    Singleton() = default; 

private: 

    static Child Instance_; 

}; 

template <typename Child> Child Singleton<Child>::Instance_; 

我知道斯科特邁爾斯一個Singleton實現定義靜態Instance_GetInstance()函數內的。

inline static Child& Instance() { 
    static Child Instance_; 
    return Instance_; 
} 

但不存在額外的開銷參與其中,因爲它必須檢查每一個函數調用時是否Instance_已經被初始化的時間。

+1

可能是一個很好的問題http://codereview.stackexchange.com – RhinoDevel

+0

只有當對象正在創建時的差異。在你的情況下,對象將在主要功能之前構建,邁耶斯的技巧顯示延遲建設。關於表現,這至少是你應該關心的部分。正如Meyers所說 - 除非profiler這樣說,否則不要進行優化。 – jonezq

回答

2

您的解決方案傾向於static initialization order fiasco

靜態類成員與所有全局靜態變量一起初始化;在main()之前,以未指定的順序。如果一個靜態變量的初始化碰巧引用了另一個靜態變量,則會導致未定義的行爲。

但是,在函數中使用靜態變量會給您特殊的保證:只有在函數首次執行時纔會創建對象。這意味着你不必擔心初始化順序(顯然,除非你創建了一個循環)。

關於性能,檢查是由編譯器實現的,所以它可能調優得非常好。一如既往,如果你有疑問 - 基準。