我想了解影響/副作用/優點最近的代碼更改有人作出。變化如下:此代碼更改有什麼用途?
原始
static List<type1> Data;
修改
static List<type1> & getData (void)
{
static List<type1> * iList = new List<type1>;
return * iList;
}
#define Data getData()
什麼目的,可以在變更服務?
我想了解影響/副作用/優點最近的代碼更改有人作出。變化如下:此代碼更改有什麼用途?
原始
static List<type1> Data;
修改
static List<type1> & getData (void)
{
static List<type1> * iList = new List<type1>;
return * iList;
}
#define Data getData()
什麼目的,可以在變更服務?
我可以看到修訂的好處是'初始化時間'的問題。
在調用main()
之前,舊代碼觸發了初始化。
直到第一次調用getData()
時,新代碼纔會觸發初始化;如果該函數從未被調用過,那麼您從來不會花錢來初始化您沒有使用的變量。 (次要的)缺點是每次使用函數時都會在生成的代碼中進行初始化檢查,並且每次需要訪問數據列表時都會有一個函數調用。
初始化後的值生命週期如何?那會是一樣的嗎? – Lazer 2012-01-14 20:38:52
一旦初始化,它將永遠持續(直到程序終止)。我相信,如果該計劃退出控制,它應該被徹底銷燬。 (哦,但是它是動態分配的;當程序退出時它可能只是'泄漏'了嗎?這種'泄漏'是非常無害的,除非列表中的數據類型獲取需要在程序退出時正式發佈的資源。 ) – 2012-01-14 20:39:50
@拉澤爾:是的。壽命與原始代碼的情況相同。 – 2012-01-14 20:40:46
如果您有一個具有靜態持續時間的變量,它將在應用程序初始化時創建。當應用程序終止時,對象被銷燬。無法控制創建不同對象的順序。
更改將使對象在第一次使用時被創建,並且(因爲它是動態分配的)它永遠不會被銷燬。
如果其他對象在銷燬時需要這個對象,這可能是件好事。
更新
原代碼使用可變Data
訪問的對象。新代碼不必以任何方式修改。當代碼使用Data
時,它實際上會使用宏Data
,它將被擴展爲getData()
。該函數將返回對實際(動態分配的對象)的引用。實際上,新代碼將作爲舊代碼的直接替代品,唯一明顯的區別在於我在上面的原始答案中所描述的內容。
是的,物體不會被破壞,但它將如何被訪問? – Lazer 2012-01-14 20:45:36
只要有人調用Lazer,getData就會被訪問。 – 2012-01-14 20:49:04
延期施工,直到Data
的第一次使用避開「static initialization order fiasco」。
製作的一些猜測你的List
,......的默認構造Data
大概是type1
項目列表爲空,所以它可能不是在問題導致慘敗的巨大風險。但也許有人覺得安全而不是抱歉比較好。
爲什麼有這種變化是由幾個原因:
也許避免某種靜態初始化問題? – Anycorn 2012-01-14 20:37:11
'#定義數據...'只是要求麻煩 – tenfour 2012-01-14 20:42:24
@ Lol4t0:請您解釋一下關於您的評論的更多信息?它如何不是線程安全的? – Lazer 2012-01-14 20:43:45