您好,歡迎進入深圳市穎特新科技有限公司官方網(wǎng)站!
01
—
虛擬內存
我們要知道,在編程過程中,我們直接操作的內存其實是虛擬內存,使用的地址也是虛地址,但虛擬內存更易于我們來理解程序的執(zhí)行過程。
虛擬內存是計算機系統(tǒng)內存管理的一種技術。它使得應用程序認為它擁有連續(xù)的可用的內存(一個連續(xù)完整的地址空間),而實際上,它通常是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在需要時進行數(shù)據(jù)交換。
上面是百度百科對虛擬內存的定義。應該是比較好理解的,不能理解也沒關系,不會影響你閱讀這篇文章的。下面,我們所提到的內存,均為虛擬內存。
02
—
內存分配
首先,我們來看看內存長啥樣。
對,就是這么一個簡陋的長條子。我們的程序就是在這么一段內存里產生了各種各樣奇妙的結果。
最上面是高位地址,往下是低位地址。我們來一部分一部分地來看。
代碼區(qū)
顧名思義,你的代碼全部儲存在這里。程序執(zhí)行的時候,順序結構只會執(zhí)行一次,如果是遞歸,或者調用函數(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分配的內存便是從這里分配的。
棧區(qū)
這一部分存放函數(shù)的參數(shù)值、局部變量的值等。它類似于數(shù)據(jù)結構中的棧。每當一個函數(shù)被調用,該函數(shù)返回地址和一些關于調用的信息,比如某些寄存器的內容,被存儲到棧區(qū)。然后這個被調用的函數(shù)再為它的自動變量和臨時變量在棧區(qū)上分配空間,這就是C實現(xiàn)函數(shù)遞歸調用的方法。由于遞歸會使用大量棧空間,所以遞歸一定要慎用,否則有棧溢出的可能。
命令行參數(shù)區(qū)
這里儲存著調用文件時命令行傳入的參數(shù)以及系統(tǒng)的環(huán)境變量。
調用一個函數(shù)的時候,參數(shù)會按照從右向左的順序壓入棧中,當執(zhí)行完畢時,會從下往上依次返回,所以雖然內存有限,但卻能運行很大的程序。
上一篇:理解字節(jié)序(轉)
下一篇:imx6ul開發(fā)板