3 回答

TA貢獻1909條經(jīng)驗 獲得超7個贊
原因是減小程序大小。想象一下,您的C程序在嵌入式系統(tǒng)上運行,其中代碼和所有常量都保存在真正的ROM(閃存)中。在這樣的系統(tǒng)中,必須在調(diào)用main()之前執(zhí)行初始的“ copy-down”以設(shè)置所有靜態(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可能是一些非常有效的內(nèi)聯(lián)匯編程序,這意味著可以更快地執(zhí)行啟動復(fù)制。

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

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