溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C之內(nèi)存布局(三十六)

發(fā)布時(shí)間:2020-07-28 17:10:42 來源:網(wǎng)絡(luò) 閱讀:558 作者:上帝之子521 欄目:編程語言

        我們?cè)谏瞎?jié)中說到了棧區(qū)、堆區(qū)以及靜態(tài)存儲(chǔ)區(qū),那么我們來看看在程序文件的一般布局。我們先來看看不同代碼在可執(zhí)行程序中的對(duì)應(yīng)關(guān)系,如下圖所示

C之內(nèi)存布局(三十六)

        我們看到程序中的經(jīng)過初始化的全局變量和加 static 修飾的初始化過后的局部變量都放在 .data 段,未經(jīng)初始化的全局變量和加 static 修飾的局部變量都放在 .bss 段,函數(shù)和函數(shù)調(diào)用都放在 .text 段。

        我們下來看看程序和進(jìn)程的區(qū)別,程序是靜態(tài)的概念表現(xiàn)為一個(gè)可執(zhí)行文件,而進(jìn)程是動(dòng)圖的概念,程序由操作系統(tǒng)加載運(yùn)行后得到進(jìn)程。每個(gè)程序可以對(duì)應(yīng)多個(gè)進(jìn)程,但是每個(gè)進(jìn)程只能對(duì)應(yīng)一個(gè)程序。我們舉例來說,一個(gè)瀏覽器就相當(dāng)于是程序,它沒運(yùn)行就沒有對(duì)應(yīng)的進(jìn)程。但是我們可以同時(shí)多次打開同一個(gè)瀏覽器,這時(shí)每個(gè)打開的瀏覽器就相當(dāng)于是一個(gè)進(jìn)程。

        我們?cè)诿嬖囍杏袝r(shí)會(huì)遇到這樣的問題:包含腳本代碼的文本文件是一種類型的可執(zhí)行程序嗎?如果是,它對(duì)應(yīng)什么樣的進(jìn)程呢?我們想的是腳本程序嘛,就肯定能直接運(yùn)行哈,那它會(huì)對(duì)應(yīng)什么樣的進(jìn)程呢?不知所云了。哈哈,我們來看看一般的可執(zhí)行程序和腳本文件的區(qū)別,如下圖所示

C之內(nèi)存布局(三十六)

        我們看到可執(zhí)行程序是由操作系統(tǒng)直接加載的,便直接對(duì)應(yīng)了一個(gè)進(jìn)程。但是我們運(yùn)行腳本文件之后,那么操作系統(tǒng)中會(huì)有對(duì)應(yīng)的腳本解釋程序,經(jīng)腳本解釋程序執(zhí)行后,便產(chǎn)生對(duì)應(yīng)的進(jìn)程,這個(gè)進(jìn)程反過來讀取并解釋執(zhí)行腳本。這樣腳本文件就得到運(yùn)行啦。

        下來我們來看看文件布局在內(nèi)存中的映射

C之內(nèi)存布局(三十六)

        我們看到可執(zhí)行程序 a.out 中分為頭文件、.text、.data 以及 .bss 段。對(duì)應(yīng)在進(jìn)程中便去掉了頭文件而加上了棧和堆。那么我們接下來講講各個(gè)段的作用,堆棧段在程序運(yùn)行后才正式存在,是程序運(yùn)行的基礎(chǔ); .bss 段存放的是未初始化的全局變量和靜態(tài)變量; .text 段存放的是程序中的可執(zhí)行代碼; .data 段保存的是已經(jīng)初始化了的全局變量和靜態(tài)變量; .rodata 段存放程序中的常量值,如字符串常量。

        靜態(tài)存儲(chǔ)區(qū)通常指程序中的 .bss 和 .data 段;只讀存儲(chǔ)區(qū)通常指程序中的 .rodata 段;局部變量所占空間為棧上的空間;動(dòng)態(tài)空間為堆中的空間;程序可執(zhí)行代碼存放于 .text 段。

        那么我們想下,同是全局變量和靜態(tài)變量,為什么初始化的和未初始化的需要保存在不同段中呢?通常在編譯器中,沒有初始化的變量,我們都要初始化為 0,如果我們一個(gè)一個(gè)的去檢查,是不是效率就很低呢?如果我們分開存放,那么那些已經(jīng)初始化過的變量就不用去檢查了,從而效率會(huì)變高。

        通過對(duì)程序文件中內(nèi)存布局的學(xué)習(xí),總結(jié)如下:1、程序源碼在編譯后對(duì)應(yīng)可執(zhí)行程序中的不同存儲(chǔ)區(qū);2、程序和進(jìn)程不同,程序是靜態(tài)概念,進(jìn)程是動(dòng)圖概念;3、堆棧段是程序運(yùn)行的基礎(chǔ),只存在于進(jìn)程空間中;4、程序可執(zhí)行代碼存放于 .text 段,是只讀的;5、.bss 和 .data 段用于保存全局變量和靜態(tài)變量。


        歡迎大家一起來學(xué)習(xí) C 語言,可以加我QQ:243343083。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI