堆與棧的區別

2021-06-18 00:14:05 字數 1366 閱讀 6487

在進行c/c++程式設計時需要程式設計師對記憶體的了解比較精確,經常使用到的記憶體有以下幾種:

棧:由編譯器自動分配和釋放,存放函式的引數值、區域性變數的值,操作方式類似於資料結構中的棧。(函式體中定義的變數通常是在棧上)

堆:一般由程式設計師分配和釋放,與資料結構中的堆是兩碼事,操作方式類似於鍊錶。(用malloc、calloc、realloc等分配得到的在堆上

)全域性區(靜態區):全域性變數和靜態變數的儲存時放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和靜態變數在一塊區域,程式結束後由系統釋放(函式體外定義的是全域性量,加了static修飾的不管在**都存放在全域性區)

文字常量區:常量字串,程式結束後釋放(字串通常放在常量區)

程式**區:程式的二進位制**

注意:函式體外定義的static變數表示在該檔案中有效,不能extern到別的檔案;在函式體內定義的static表示只在該函式體內有效。

用**解析:

int a=0;//全域性初始化區

char *p1;//全域性未初始化區

main()

區別:

1.管理方式

棧由系統自動分配和釋放;

堆由程式設計師申請並釋放

2.空間分配

對於棧,只要棧的剩餘空間大於所申請的空間,系統就分配,否則,報異常;

對於堆,作業系統有乙個

記錄空閒記憶體位址的鍊錶

,當系統收到申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆節點,然後將該節點從空閒區煉表中刪除,將該節點的空間分配給程式,若是找到的節點位址空間大於申請的大小,系統會把剩餘的節點空間重新新增到記憶體空閒區煉表中

3.生長方向

在window下,棧是隨著記憶體位址減小的方向增長,是一塊連續的區域,棧的大小事2mb,如果申請的空間超過棧的剩餘空間,將提示棧溢位

堆是隨著記憶體位址增加的方向增長,且不連續,堆的大小受限於計算機系統的虛擬記憶體,堆獲得的空間比較大,也比較靈活

4.

申請效率

棧由系統分配,速度快,程式設計師無法控制;堆由程式設計師分配,速度慢

5.是否產生碎片

對於棧,先進後出的機制保證永遠不會有乙個記憶體從棧中間彈出;

對於堆,頻繁的new、delete是比會造成記憶體空間的不連續,從而造成大量碎片。

5.儲存方式

棧在函式呼叫時,引數由右往左入棧,然後是區域性變數,靜態變數不入棧,出棧時,區域性變數先出棧,然後是引數;

堆一般用堆的頭部用乙個位元組存放堆的大小,便於delete或者free

堆與棧區別

檢視文章 關於記憶體中棧和堆的區別 2008 09 02 17 12 1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器...

棧 與 堆 的區別

預備知識 堆與棧有什麼區別?一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束...

堆與棧的區別

堆與棧有什麼區別?一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由o...