棧和堆的區別

2021-10-22 22:30:04 字數 450 閱讀 9523

申請方式:

棧是系統自動分配,堆是程式設計師主動申請。

申請後系統響應:

分配棧空間,如果剩餘空間大於申請空間則分配成功,否則分配失敗棧溢位;申請堆空間,堆在記憶體中呈現的方式類似於鍊錶(記錄空閒位址空間的鍊錶),在鍊錶上尋找第乙個大於申請空間的節點分配給程式,將該節點從鍊錶中刪除,大多數系統中該塊空間的首位址存放的是本次分配空間的大小,便於釋放,將該塊空間上的剩餘空間再次連線在空閒鍊錶上。

棧在記憶體中是連續的一塊空間(向低位址擴充套件)最大容量是系統預定好的,堆在記憶體中的空間(向高位址擴充套件)是不連續的。

申請效率:

棧是有系統自動分配,申請效率高,但程式設計師無法控制;堆是由程式設計師主動申請,效率低,使用起來方便但是容易產生碎片。

存放的內容:

棧中存放的是區域性變數,函式的引數;堆中存放的內容由程式設計師控制。

總結:正如去餐廳吃飯,棧就是已有**,而堆就是自選**。

堆和棧區別

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

堆和棧區別

管理方式 棧由編譯器自動管理 堆由程式設計師控制,使用方便,但易產生記憶體洩露。生長方向 棧向低位址擴充套件 即 向下生長 是連續的記憶體區域 堆向高位址擴充套件 即 向上生長 是不連續的記憶體區域。這是由於系統用鍊錶來儲存空閒記憶體位址,自然不連續,而鍊錶從低位址向高位址遍歷。空間大小 棧頂位址和...

堆和棧區別

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