2013-06-24 50 views
0

我有一個「處理器」類,需要幾件事情: 1)訪問允許訪問數據庫的類的實例。 2)訪問字符串實用程序類。 3)在運行時從配置文件讀取的超時整數值。C++:有沒有更好的替代方案來使用這種情況下的靜態屬性?

所以我想指向前兩個作爲成員屬性和第三個簡單的int屬性。通常情況下,在這種情況下,我只需要構造函數爲前兩個指針指針,爲第三個指針指針指針,然後在主體中將成員指派給傳入的項目。

問題是,我將有一個像這個處理器類的100個實例的池,我想知道是否浪費內存讓每個實例都包含它自己的(2)指針和整數屬性,當所有指針指向相同的兩個對象,並且所有整數在整個過程的整個生命週期中都保持相同的值。

我熟悉「全局狀態很糟糕」的概念,並且覺得它不鼓勵使用靜態成員屬性。但在這種情況下,簡單地將這三個屬性設爲靜態是不是更高效?然後,我只是創建一個靜態「initStaticMembers」方法,它接受兩個指針和整數,並將靜態成員屬性分配給傳入的項目。在創建處理器實例池之前,initStaticMembers將被調用一次。

我不是那最後一部分(靜態initStaticMembers方法)的一個巨大的粉絲......只是看起來不太優雅,但我看不到一個更好的選擇。任何人都有建議?我是否認爲使用靜態屬性可以節省內存而不是爲每個處理器類實例提供它自己的一組屬性實例?

我還應該注意到,指向的類是線程安全的,所以我不認爲我需要關心所有處理器共享一個指向每個指針的單個指針。

感謝您的任何反饋意見。

+0

發表您到目前爲止已經提出的一些代碼可能會有所幫助。 – moonbeamer2234

+1

假設32位:2個指針* 4個字節* 100個對象=虛擬空間的4Gb中的800個字節。假設64位:2個指針* 8個字節* 100個對象=大量內存中的1600個字節......你真的需要刮掉1.5K的內存嗎? –

+0

嗯......沒有想到實際上使用的內存有多少。直到我看到數字時,看起來像更多。可能只是讓它們成爲非靜態的類屬性。謝謝。 – Brent212

回答

0

如果數據庫類是一個真正的應用程序全局事物,那麼使它成爲全局的。有些東西只是全球,而這種戰鬥會導致難以閱讀的代碼。

當您的應用程序是自包含的,並且您正在編寫的類特定於該應用程序時,使用Singleton模式創建應用程序類通常是可以的。

Application::GetInstance().GetDatabase(); 

如果你有靜態方法:

Application& Application::GetInstance() 
{ 
    static Application app; 
    return app; 
} 
1

考慮使用static成員的確會節省一些內存你所描述的情況,

(極少量在這種情況下)。

如果你可以保證兩個條件,那麼我會說在這裏使用靜態是安全的。這兩個條件是:

  1. initStaticMembers總是任何這些靜態成員數據的使用之前被調用;
  2. 所有Processor實例的生命週期在數據庫訪問類和字符串實用程序類的生命週期之後開始,並在它們之前結束。

如果您可以保證這些(例如,在代碼管理Processor s的池),那麼你很好。正如良好的編碼習慣一樣,請確保您在之後再次撥打initStaticMembers完成所有處理器,其中nullptr和零值。

避免static數據通常是非常好的做法。但這主要是因爲你無法輕鬆控制靜態對象的生命週期(以及初始化順序)。然而,它看起來像你的靜態指針成員實際上並不是自己的任何東西,並不控制任何對象的生命週期,這是一件好事。因此,簡而言之,如果你小心,在這種情況下使用靜態成員數據應該沒問題。但是,我需要再次強調,你在這裏並沒有節省太多的記憶。

如果你的靜態數據比較大(大於幾個指針和一個int),我建議使用非靜態的shared_ptr而不是原始指針來指向它們。但是,就你而言,shared_ptr數據結構將比你的整個共享數據大。

相關問題