堆和棧的區別要從兩方面來講:
一、資料結構
1.棧記憶體是由系統分配,系統釋放,以函式為單位進行棧記憶體分配,函式棧幀、區域性變數、形參變數都儲存在棧記憶體上
堆記憶體是由使用者自己分配的,c語言用malloc/free進行申請/釋放記憶體,c++用new/delete進行申請/釋放記憶體,
由於堆需要使用者自己管理,因此記憶體很容易造成洩露,而棧不會。
2.棧的記憶體分配釋放速度快,效率高,記憶體都是連續的
堆記憶體的分配釋放相對來說效率低一些,記憶體不一定連續,容易產生記憶體碎片,但靈活性高
二、虛擬位址空間
首先,我們了解下c++中虛擬位址空間的布局
.text指令段:存放指令
.data資料段:已初始化的資料且初始化資料不為零
.bss資料段:未初始化的資料或初始化資料為零
共享庫stack棧區:所有函式的活動空間
命令列引數:傳遞引數
環境變數:可以拿到庫的標頭檔案
zone_dma直接記憶體訪問:針對資料流向,不經過暫存器
zone_normal常用部分:虛擬空間和記憶體的對映關係
zone_highmem高階記憶體:大檔案的對映
由上可得:
棧是由高位址像低位址擴充套件的連續記憶體,棧的大小一般為2m或者10m
堆是由低位址向高位址擴充套件的非連續記憶體,堆的大小影響因素較多,和系統虛擬位址記憶體的大小有關。
C 堆和棧區別
c 中,記憶體分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧 是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數 函式引數等。堆 是由new分配的記憶體塊,由程式設計師釋放 編譯器不管 一般乙個new與乙個delete對應,乙個new與乙個delete對...
c 面試題 堆和棧的區別
二 說一說棧和堆的區別 1 記憶體分配方式不同 1 棧記憶體 儲存區域性變數 臨時變數 函式引數等,由編譯器自動分配和 記憶體,2 堆記憶體 由程式設計師手動分配和 記憶體,使用new運算子手動申請記憶體,必須使用delete手動釋放記憶體 2 申請大小限制 棧 在windows下,棧是向低位址擴充...
c 棧和堆的區別
在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...