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

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

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),運(yùn)河企業(yè)網(wǎng)站建設(shè),運(yùn)河品牌網(wǎng)站建設(shè),網(wǎng)站定制,運(yùn)河網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,運(yùn)河網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

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)程。

        我們在面試中有時(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。

網(wǎng)頁標(biāo)題:C之內(nèi)存布局(三十六)
本文URL:http://muchs.cn/article10/gdihdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT手機(jī)網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、標(biāo)簽優(yōu)化、移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)