BSS段清零的原因

2022-07-28 09:30:19 字數 1016 閱讀 1911

bss段清零的原因是因為這個段是bss 

要說為什麼要有bss的話,歷史就比較久遠了。 bss段我所知道的起源是unix最初的時候(當然,不排除可能有更早的情況)。變數分兩種:區域性變數、全域性變數。

根據c語法的規定,區域性變數不設定初始值的時候,其初始值是不確定的,區域性變數(不含靜態區域性變數)的儲存位置位於棧上,具體位置不固定。

全域性變數(和靜態區域性變數)有專門資料段儲存,初始值是0,具體位置是固定的。

其實說到底,就兩種,一種是位置固定(資料段裡),一種是位置不固定的(棧上)。 

要知道,早期的計算機儲存裝置是很貴的,而很多時候,資料段裡的全域性變數都是0(或者沒有初始值),那麼儲存這麼多的0到目標檔案裡其實是沒有必要的。所以為了節約空間,在生成目標檔案的時候,就把沒有初始值(實際就是0)的資料段裡的變數都放到bss段裡,這樣目標檔案就不需要那麼大的體積裡(節約磁碟空間)。只有當目標檔案被載入的時候,載入器負責把bss段清零(乙個迴圈就可以搞定)。 之後,這個規則慢慢的成為乙個標準配置,大多數編譯器也就都支援了bss段。

然後解釋幾個問題: 

a:區域性變數初始值也可以是零(在某些語言中就是),但這實際上需要消耗硬體指令去完成,有些時候這種清零的動作意義不大,對於編譯器來說也是一種負擔,每次呼叫函式都要消耗指令去清零,負擔太大。要知道全域性變數在記憶體中只有乙份,區域性變數(非靜態)可以是多份的,前者一次清零就可以了,後者多次清零,負擔太大。 

a:可以,如果編譯器規定bss段不清零,也是可以的,但這樣的話c語言語法就要改了:未初始化的全域性變數和靜態區域性變數,其值是未知的。甚至其它語言也要跟著改語法。 

所以,bss段清零的原因是因為這個段是bss 現在儲存介質這麼便宜了,是不是bss已經沒有必要了?當然不是了,介質便宜僅限於pc和數碼產品這一塊,嵌入式行業永遠都不存在儲存介質沒有限制的情況。

在系統啟動過程中作業系統會進行bss段的初始化,如下為arm32 linux通過編寫彙編在啟動階段對bss執行了清零操作。

BSS段清零的原因

bss段清零的原因是因為這個段是bss 要說為什麼要有bss的話,歷史就比較久遠了。bss段我所知道的起源是unix最初的時候 當然,不排除可能有更早的情況 變數分兩種 區域性變數 全域性變數。根據c語法的規定,區域性變數不設定初始值的時候,其初始值是不確定的,區域性變數 不含靜態區域性變數 的儲存...

BSS段必須清零的原因

bss段清零的原因是因為這個段是bss 要說為什麼要有bss的話,歷史就比較久遠了。bss段我所知道的起源是unix最初的時候 當然,不排除可能有更早的情況 變數分兩種 區域性變數 全域性變數。根據c語法的規定,區域性變數不設定初始值的時候,其初始值是不確定的,區域性變數 不含靜態區域性變數 的儲存...

bss段和 data段的區別

在採用段式記憶體管理的架構中 比如intel的80x86系統 bss段 block started by symbol segment 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域,一般在初始化時bss 段部分將會清零。bss段屬於靜態記憶體分配,即程式一開始就將其清零了。比如,在c語...