2012-01-28 54 views
1

在C++中,我使用單例類,並引用另一個類中的唯一實例。我想知道什麼是最有效的方法來訪問這個實例,因爲它是一個大型的數據結構。我考慮過這些事情。使用單例類的最有效方法

  1. 充分利用單類的引用,除了按值
  2. 傳遞數據結構用我的第二類的全局實例,它使用單例類:

    Singleton* singleInstance; 
    
    SingletonUser::SingletonUser() 
    { 
        singleInstance = Singleton::getInstance(); //passes the single instance by reference, then it will be used in the class wherever needed 
    } 
    
  3. 在做同樣的事情在第二類的函數中,以便我在需要時獲得對單例類的實例的引用(需要在多個函數中多次訪問它)。

我不確定哪種做法是最好的。有人可以解釋,如果有更有效的方法,也解釋一下嗎?

謝謝!

+2

如果'的getInstance()'方法返回指向在你的第二例如,無論對象具有多大的大小,您只需支付調用getInstance()方法和複製指針的代價。你究竟想要優化什麼? – 2012-01-28 04:29:33

+0

@AndréCaron:時間。 Singleton類有一個非常大的數據結構。這就是爲什麼我想通過參考傳遞。有一個更好的方法嗎? – Izza 2012-01-28 04:32:22

+2

@Izza:但是如果你沒有按照價值傳遞它,那麼複製永遠不會被創建(如果你是這樣的話,它首先不會是單例)。你有什麼其他方式來回答參考? – Cameron 2012-01-28 04:36:08

回答

3

如果你通過價值傳遞你的單例實例,那麼它不是一個單例,是嗎?

只要您需要訪問它(#1),只需返回一個引用(或指針)到實例。爲每個客戶緩存參考一次只會增加複雜性,幾乎肯定不會更快。

我不確定#1和#3之間有什麼區別,除了增加了複雜性。兩者都使用函數通過引用/指針訪問單例實例。

+0

我的印象是,如果你需要在課堂上多次練習,那最好是緩存。但我明白你的意思。因爲它會發生在每個用戶身上,所以不會太有用。謝謝! – Izza 2012-01-28 04:39:13

+0

@Izza:但你會緩存一個指針!從你的實例中獲得一個指針,而不是單例類會更快嗎? – Cameron 2012-01-28 04:41:20

+0

是的,我明白了,這不是一個好方法。感謝expalnation。 – Izza 2012-01-28 04:48:15

1

您的選項#3是最優選的。儘量不要不必要地緩存引用 - 隨着時間的推移,那些緩存的引用往往成爲維護的負擔。

只是在一般情況下,嘗試避免單身模式。在C++中,全局函數(非成員)同樣好,並且允許設計發展。

+2

如果我讀了#3,它爲每個客戶端實例緩存一次引用(而#1從類本身獲取引用)。 – Cameron 2012-01-28 04:37:37

+1

@Cameron:你可能是對的。如果是這樣,我的意思是#1。無論如何,不​​必要的緩存==不好。 – mcmcc 2012-01-28 04:49:44

+0

@mcmcc:我認爲singletons比全局函數更受歡迎。爲什麼全局函數比單例更好? – Izza 2012-01-28 04:51:35

2

首先,在C++避免指針可能時,而不是通過引用傳遞:

Singleton& Singleton::getInstance() { 
    return *singleton; 
} 

然後在代碼:

Singleton& st = Singleton::getInstance(); 
st.someFunction();