默認情況下,全局變量初始化爲「0」。全局變量初始化優化
當我爲其明確賦值「0」時,它會產生多少差異(如果有的話)。
它們中的任何一個是更快/更好/更優化?
我嘗試了一個小樣本.c程序,但我沒有看到可執行文件大小的任何變化。
編輯:0我只是想了解行爲。它對我來說不是什麼瓶頸。
默認情況下,全局變量初始化爲「0」。全局變量初始化優化
當我爲其明確賦值「0」時,它會產生多少差異(如果有的話)。
它們中的任何一個是更快/更好/更優化?
我嘗試了一個小樣本.c程序,但我沒有看到可執行文件大小的任何變化。
編輯:0我只是想了解行爲。它對我來說不是什麼瓶頸。
的回答你的問題是非常具體實施,但通常所有未初始化的全局變量和靜態變量在.bss段結束。顯式初始化變量位於其他一些data segment中。在執行main()
之前,這兩項都將被程序加載器複製。因此,在顯式初始化爲零和保留變量未初始化之間不應該有任何性能差異。
IMO最好將全局變量和靜態變量初始化爲零,因爲它清楚地表明初始值爲零。
非常感謝您的詳細解答。 – hari 2012-03-12 18:49:17
如何檢查.bss和數據段?看看裏面有什麼? – hari 2012-03-13 20:37:58
@hari告訴你的鏈接器生成一個地圖文件,它將列出各個部分 – Praetorian 2012-03-13 20:47:23
我懷疑是否存在差異,但即使存在這樣的差異,我仍然懷疑您的程序是如此優化以至於存在瓶頸。
我寧願建議您不要在乎所有這些類型的問題,並隨意編寫代碼,也許讓位於可讀性而不是速度,只留下優化作爲最終問題。
過早的優化是所有罪惡
當你說了優化,我假設你的意思是在執行速度更快的根源。如果是這樣,那麼就不會有任何區別。編譯器甚至可能會刪除全局變量的初始化(編譯器內部不確定)。如果你的意思是程序的空間利用率 - 那也不會有什麼不同。
更大的問題是,是否有一個特定的原因,你試圖通過初始化全局變量來優化。你能多解釋一下嗎?
沒有。優化器將其視爲無操作。
顯式初始化對於未經訓練的眼更爲詳細和清晰。如果你的團隊中有後輩,我會明確地初始化這些變量。
沒有顯式初始化器的靜態對象在啓動時被初始化爲零。無論是否將對象明確初始化爲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;
}
這是一個微型優化,我不關心自己。這是不太可能有任何明顯的變化(如果有的話)。 – JaredPar 2012-03-12 18:29:06
如果您在兩個可執行文件之間做了差異,您應該看到它們完全相同。 – 2012-03-12 18:31:48