行程與行程抽象
BSS(未初始化資料)區段
/ B-S-S /
假設你的食譜需要三個空的攪拌盆。你不會記下盆裡裝了什麼,因為它們一開始就是空的;你只需要知道要備出三個盆。BSS 區段就是行程記憶體中為「一開始為零」的全域與靜態變數所保留的部分。程式不需要在可執行檔裡為它們儲存任何值,只需要知道在啟動時要保留多少空間並歸零。
BSS 這個名稱是一個古老的組譯器術語(block started by symbol),其含義早已偏移,所以就把它當成「未初始化資料區」的一個標籤即可。當作業系統載入程式時,它為 BSS 保留一塊記憶體,並在程式執行前用零填滿。由於這些值全是零,磁碟上不必為它們儲存任何東西,這正是為什麼一個宣告了巨大零填充陣列的程式,並不會產生巨大的可執行檔。BSS 像資料區段一樣可讀寫,程式執行時可以自由改變這些變數。
理解 BSS 可以解開一個常見的驚訝:為什麼一個含有龐大全域陣列的程式編譯出來卻是個小檔案。那個陣列住在 BSS 裡,以「保留 N 位元組、設為零」的形式儲存,而不是 N 位元組的實際資料。在 C 之類的語言裡,這也是為什麼未初始化的全域變數保證從零開始(作業系統把 BSS 歸零),而堆疊上未初始化的區域變數則不會被歸零,會持有之前殘留的任何垃圾值。
宣告「static char buffer[1000000];」會在 BSS 中增加一百萬位元組(在啟動時保留並歸零),但幾乎不會讓可執行檔變大,因為沒有儲存任何值,只儲存了大小。
零填充的空間不佔檔案大小;只記錄它的大小。
只有全域與靜態變數會經由 BSS 被歸零。堆疊上未初始化的區域變數不會被歸零,會含有殘留的垃圾值,這是臭蟲的常見來源。
又稱
另見