您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!
01
—
虛擬內(nèi)存
我們要知道,在編程過程中,我們直接操作的內(nèi)存其實是虛擬內(nèi)存,使用的地址也是虛地址,但虛擬內(nèi)存更易于我們來理解程序的執(zhí)行過程。
虛擬內(nèi)存是計算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)的可用的內(nèi)存(一個連續(xù)完整的地址空間),而實際上,它通常是被分隔成多個物理內(nèi)存碎片,還有部分暫時存儲在外部磁盤存儲器上,在需要時進(jìn)行數(shù)據(jù)交換。
上面是百度百科對虛擬內(nèi)存的定義。應(yīng)該是比較好理解的,不能理解也沒關(guān)系,不會影響你閱讀這篇文章的。下面,我們所提到的內(nèi)存,均為虛擬內(nèi)存。
02
—
內(nèi)存分配
首先,我們來看看內(nèi)存長啥樣。
對,就是這么一個簡陋的長條子。我們的程序就是在這么一段內(nèi)存里產(chǎn)生了各種各樣奇妙的結(jié)果。
最上面是高位地址,往下是低位地址。我們來一部分一部分地來看。
代碼區(qū)
顧名思義,你的代碼全部儲存在這里。程序執(zhí)行的時候,順序結(jié)構(gòu)只會執(zhí)行一次,如果是遞歸,或者調(diào)用函數(shù),則需要棧來實現(xiàn)。這一段區(qū)域還存儲著一些常量,比如字符串常量。
rodata區(qū)域
這一部分在圖上沒有,但確實很重要的一塊,這里存儲著常量,但是不是所有常量都存儲在這里。
全局初始化數(shù)據(jù)區(qū)/靜態(tài)數(shù)據(jù)區(qū)(Data Segment)
這一部分存儲著靜態(tài)變量和已經(jīng)初始化(非零)的全局變量,在這里存儲的數(shù)據(jù)都是已經(jīng)初始化過的。
未初始化數(shù)據(jù)區(qū)(BSS)
這一部分存儲著未初始化的全局變量和初始化為0的全局變量。
堆區(qū)
在程序中使用malloc和calloc分配的內(nèi)存便是從這里分配的。
棧區(qū)
這一部分存放函數(shù)的參數(shù)值、局部變量的值等。它類似于數(shù)據(jù)結(jié)構(gòu)中的棧。每當(dāng)一個函數(shù)被調(diào)用,該函數(shù)返回地址和一些關(guān)于調(diào)用的信息,比如某些寄存器的內(nèi)容,被存儲到棧區(qū)。然后這個被調(diào)用的函數(shù)再為它的自動變量和臨時變量在棧區(qū)上分配空間,這就是C實現(xiàn)函數(shù)遞歸調(diào)用的方法。由于遞歸會使用大量棧空間,所以遞歸一定要慎用,否則有棧溢出的可能。
命令行參數(shù)區(qū)
這里儲存著調(diào)用文件時命令行傳入的參數(shù)以及系統(tǒng)的環(huán)境變量。
調(diào)用一個函數(shù)的時候,參數(shù)會按照從右向左的順序壓入棧中,當(dāng)執(zhí)行完畢時,會從下往上依次返回,所以雖然內(nèi)存有限,但卻能運行很大的程序。
下一篇:imx6ul開發(fā)板
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08