2012-01-14 79 views
6

我想了解影響/副作用/優點最近的代碼更改有人作出。變化如下:此代碼更改有什麼用途?

原始

static List<type1> Data; 

修改

static List<type1> & getData (void) 
{ 
    static List<type1> * iList = new List<type1>; 
    return * iList; 
} 
#define Data getData() 

什麼目的,可以在變更服務?

+0

也許避免某種靜態初始化問題? – Anycorn 2012-01-14 20:37:11

+2

'#定義數據...'只是要求麻煩 – tenfour 2012-01-14 20:42:24

+0

@ Lol4t0:請您解釋一下關於您的評論的更多信息?它如何不是線程安全的? – Lazer 2012-01-14 20:43:45

回答

4

我可以看到修訂的好處是'初始化時間'的問題。

在調用main()之前,舊代碼觸發了初始化。

直到第一次調用getData()時,新代碼纔會觸發初始化;如果該函數從未被調用過,那麼您從來不會花錢來初始化您沒有使用的變量。 (次要的)缺點是每次使用函數時都會在生成的代碼中進行初始化檢查,並且每次需要訪問數據列表時都會有一個函數調用。

+0

初始化後的值生命週期如何?那會是一樣的嗎? – Lazer 2012-01-14 20:38:52

+0

一旦初始化,它將永遠持續(直到程序終止)。我相信,如果該計劃退出控制,它應該被徹底銷燬。 (哦,但是它是動態分配的;當程序退出時它可能只是'泄漏'了嗎?這種'泄漏'是非常無害的,除非列表中的數據類型獲取需要在程序退出時正式發佈的資源。 ) – 2012-01-14 20:39:50

+0

@拉澤爾:是的。壽命與原始代碼的情況相同。 – 2012-01-14 20:40:46

3

如果您有一個具有靜態持續時間的變量,它將在應用程序初始化時創建。當應用程序終止時,對象被銷燬。無法控制創建不同對象的順序。

更改將使對象在第一次使用時被創建,並且(因爲它是動態分配的)它永遠不會被銷燬。

如果其他對象在銷燬時需要這個對象,這可能是件好事。

更新

原代碼使用可變Data訪問的對象。新代碼不必以任何方式修改。當代碼使用Data時,它實際上會使用Data,它將被擴展爲getData()。該函數將返回對實際(動態分配的對象)的引用。實際上,新代碼將作爲舊代碼的直接替代品,唯一明顯的區別在於我在上面的原始答案中所描述的內容。

+0

是的,物體不會被破壞,但它將如何被訪問? – Lazer 2012-01-14 20:45:36

+0

只要有人調用Lazer,getData就會被訪問。 – 2012-01-14 20:49:04

1

延期施工,直到Data的第一次使用避開「static initialization order fiasco」。

製作的一些猜測你的List,......的默認構造Data大概是type1項目列表爲空,所以它可能不是在問題導致慘敗的巨大風險。但也許有人覺得安全而不是抱歉比較好。