2012-01-20 31 views
0

我知道bss段包含未初始化的變量,它將被賦予0作爲初始值,但爲什麼我們不只是使用數據段來存儲它們?bss段的效用是什麼?

我讀過它加快執行速度,因爲os loader一次通過調用memset初始化所有這些變量,但是,我並不十分確信,因爲加載器可以調用memset來初始化它們在數據段中!

+0

加載程序如何知道數據段的哪部分包含需要初始化的數據?實際上,它並不是清除內存的加載器,而是一個與應用程序鏈接並在調用'main'(即所謂的C運行時或CRT)之前運行的例程。 –

回答

2

因爲您可能有一大組未初始化的值。如果您要爲此目的使用數據部分,則必須填充零(或任何值,但必須在必須在那裏)。想象一下,在可執行文件中加入兆字節的零...

+0

簡版:這是爲了節省可執行文件中的空間。 – ams

+0

我明白爲什麼編譯器應該將它們分組在可執行文件中,但爲什麼os加載程序將它們存儲在內存中的一個單獨的邏輯段中! –

+0

@Pindexis我不關注。當然,當你加載時,你不能輕易地合併這兩個部分。你自然會將它們加載到兩個不同的位置。無論如何,這並不是什麼大不了的事情。 –

相關問題