3 回答

TA貢獻1909條經驗 獲得超7個贊
原因是減小程序大小。想象一下,您的C程序在嵌入式系統(tǒng)上運行,其中代碼和所有常量都保存在真正的ROM(閃存)中。在這樣的系統(tǒng)中,必須在調用main()之前執(zhí)行初始的“ copy-down”以設置所有靜態(tài)存儲持續(xù)時間對象。通常將如下所示:
for(i=0; i<all_explicitly_initialized_objects; i++)
{
.data[i] = init_value[i];
}
memset(.bss,
0,
all_implicitly_initialized_objects);
.data和.bss存儲在RAM中,而init_value存儲在ROM中。如果它是一個段,則ROM必須填充很多零,從而顯著增加ROM的大小。
盡管基于RAM的可執(zhí)行文件沒有真正的ROM,但它們的工作原理類似。
同樣,memset可能是一些非常有效的內聯(lián)匯編程序,這意味著可以更快地執(zhí)行啟動復制。

TA貢獻2011條經驗 獲得超2個贊
該.bss
細分是一種優(yōu)化。整個.bss
段用一個數字描述,可能是4個字節(jié)或8個字節(jié),該數字給出了運行過程中它的大小,而該.data
部分則與初始化變量的大小之和一樣大。因此,這.bss
使得可執(zhí)行文件更小,加載更快。否則,變量可能位于.data
顯式初始化為零的段中;該程序很難分辨出差異。(詳細來說,其中的對象地址.bss
可能與該.data
段中的地址不同。)
在第一個程序,a
將在.data
鏈段和b
將在.bss
可執(zhí)行文件的段。加載程序后,區(qū)別就不再重要了。在運行時,b
占用20 * sizeof(int)
字節(jié)。
在第二個程序中,var
分配了空間,并且分配main()
修改了該空間。碰巧的var
是,.bss
段中描述的空間而不是.data
段中描述的空間,但這并不影響程序在運行時的行為方式。

TA貢獻1790條經驗 獲得超9個贊
從匯編語言步驟分步:使用Linux編程杰夫Duntemann,有關。數據部分:
本。數據部分包含初始化的數據項的數據定義。初始化數據是在程序開始運行之前具有值的數據。這些值是可執(zhí)行文件的一部分。當將可執(zhí)行文件加載到內存中以供執(zhí)行時,它們會加載到內存中。
關于.data節(jié)要記住的重要一點是,您定義的初始化數據項越多,可執(zhí)行文件將越大,并且在運行它時將其從磁盤加載到內存所需的時間也越長。
和.bss部分:
在程序開始運行之前,并非所有數據項都需要具有值。例如,當您從磁盤文件中讀取數據時,需要有一個放置數據的位置,以便將數據從磁盤中導入。程序的.bss部分中定義了類似的數據緩沖區(qū)。您為緩沖區(qū)留出了一定數量的字節(jié),并為緩沖區(qū)指定了名稱,但是您沒有說緩沖區(qū)中將出現(xiàn)什么值。
.data節(jié)中定義的數據項與.bss節(jié)中定義的數據項之間存在至關重要的區(qū)別:.data節(jié)中的數據項增加了可執(zhí)行文件的大小。.bss部分中的數據項沒有??梢栽?bss中定義一個占用16,000字節(jié)(或更多,有時更多的字節(jié))的緩沖區(qū),并且?guī)缀醪辉黾尤魏蝺热荩枋鲋写蠹s50字節(jié))。
添加回答
舉報