2012-03-12 195 views
-1

默認情況下,全局變量初始化爲「0」。全局變量初始化優化

當我爲其明確賦值「0」時,它會產生多少差異(如果有的話)。

它們中的任何一個是更快/更好/更優化?

我嘗試了一個小樣本.c程序,但我沒有看到可執行文件大小的任何變化。

編輯:0我只是想了解行爲。它對我來說不是什麼瓶頸。

+3

這是一個微型優化,我不關心自己。這是不太可能有任何明顯的變化(如果有的話)。 – JaredPar 2012-03-12 18:29:06

+0

如果您在兩個可執行文件之間做了差異,您應該看到它們完全相同。 – 2012-03-12 18:31:48

回答

5

的回答你的問題是非常具體實施,但通常所有未初始化的全局變量和靜態變量在.bss段結束。顯式初始化變量位於其他一些data segment中。在執行main()之前,這兩項都將被程序加載器複製。因此,在顯式初始化爲零和保留變量未初始化之間不應該有任何性能差異。

IMO最好將全局變量和靜態變量初始化爲零,因爲它清楚地表明初始值爲零。

+0

非常感謝您的詳細解答。 – hari 2012-03-12 18:49:17

+0

如何檢查.bss和數據段?看看裏面有什麼? – hari 2012-03-13 20:37:58

+0

@hari告訴你的鏈接器生成一個地圖文件,它將列出各個部分 – Praetorian 2012-03-13 20:47:23

1

我懷疑是否存在差異,但即使存在這樣的差異,我仍然懷疑您的程序是如此優化以至於存在瓶頸。

我寧願建議您不要在乎所有這些類型的問題,並隨意編寫代碼,也許讓位於可讀性而不是速度,只留下優化作爲最終問題。

過早的優化是所有罪惡

2

當你說了優化,我假設你的意思是在執行速度更快的根源。如果是這樣,那麼就不會有任何區別。編譯器甚至可能會刪除全局變量的初始化(編譯器內部不確定)。如果你的意思是程序的空間利用率 - 那也不會有什麼不同。

更大的問題是,是否有一個特定的原因,你試圖通過初始化全局變量來優化。你能多解釋一下嗎?

1

沒有。優化器將其視爲無操作。

顯式初始化對於未經訓練的眼更爲詳細和清晰。如果你的團隊中有後輩,我會明確地初始化這些變量。

2

沒有顯式初始化器的靜態對象在啓動時被初始化爲零。無論是否將對象明確初始化爲0,性能可能沒有差別,因爲編譯器通常在main之前一次初始化所有零對象。

// File scope 
// Same code is likely to be generated for the two objects initialization 

int bla1; 
int bla2 = 0; 

在另一方面,如果分配0,而不是初始化,它可以有所作爲,因爲編譯器不能推斷出是什麼物體的前值。

void init(void) 
{ 
    bla1 = 0; 
    bla2 = 0; 
}