面試總結 堆疊詳解

2021-08-28 09:19:10 字數 787 閱讀 8249

棧是一種先進後出的資料結構,是一種線性結構;堆是一種非線性結構,是有序的一般為大根堆或小根堆,堆的訪問比較隨意;

一般情況下程式是放在rom或者flash中的,執行時需要拷貝到記憶體中才可以執行,記憶體會分別儲存不同的資訊。接下來就詳細介紹一下記憶體分配中堆和棧的區別。

(1)申請和**方式:棧使是系統直接分配和**的;堆是根據使用者的需要自己申請的和釋放的,因此可能忘記釋放而會造成記憶體洩漏。由此可見一般的棧的生存週期小於堆的生存週期。

(2)申請時系統的響應:當執行時需要棧空間時,系統會自動判斷需要的棧空間大小,如果需要的空間小於當前棧所剩餘的空間,則直接分配,否則提示棧的空間不足,程式直接crash;堆是由程式控制申請的,當申請堆時,系統首先會查詢記錄空閒記憶體位址的表,當找到第乙個大於等於申請空間的記憶體位址,就將該位址返回,並在首位址記錄此次分配的大小,方便後續的釋放。在找到的記憶體大於要申請的記憶體時,系統將需要的記憶體返回給使用者,將多餘的記憶體再次放回空閒記憶體表中。

(3)申請效率:棧是由系統控制的,操作速度較快,但程式設計師不可控;堆是可以有程式設計師控制的,申請時速度較棧的速度慢,但使用較為靈活,但是已造成記憶體的碎片化。

(4)大小限制:棧在windows是向低位址擴充套件的資料結構,是一塊連續的記憶體區域,因此大小有限,一般為2m;堆在記憶體中是不連續的,位址擴充套件方向是向高位址增長的,使用空閒記憶體鍊錶儲存,大小受計算機的虛擬記憶體限制,因此堆的可用大小遠遠大於棧的大小

(5)儲存內容的區別:棧中一般儲存函式呼叫的相關資訊(入口位址,引數和返回值);堆中除了頭部用於儲存堆的大小外,其餘內容均有程式設計師決定。

(6)訪問效率:棧上的陣列訪問速度比指標訪問的速度快。

堆 棧的詳解

堆 棧的詳解 堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 2 堆區 heap 一般由程式設計師分配釋放,...

c 堆疊詳解

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

堆疊的詳解

一,程式占用的記憶體分為五個部分 1.棧區 由編譯器自動分配,儲存函式的引數值以及區域性變數,類似於資料結構 棧 2.堆區 由程式設計師申請分配。3.全域性區即靜態區 存放全域性變數以及靜態變數 4.常量區 常量字串等 5.程式 區 存放函式體的二進位制 舉例 二,記憶體操作區別 案例1 靜態區和棧...