棧和堆的區別

2021-09-12 13:07:52 字數 999 閱讀 7098

棧的特性:先進後出,主要為乙個執行緒獨享,為這個執行緒的函式的呼叫服務的。用於存放返回位址,零時變數個引數而用。棧的記憶體一般都是由編譯器自己來分配釋放的,編譯器所分配的記憶體是連續的,當定義乙個變數的時候,在當前棧區的尾部來分配心的變數的記憶體。在windows系統裡面棧的大小是2m,在linux系統裡面棧的大小是8m,可以使用ulimit-s來設定棧的大小。棧的空間的分配是由高位址向低位址分配的。

堆的分配和釋放是由程式設計師來分配和釋放。在windows系統裡面一般是小於2g的。因為系統是用鍊錶來實現空閒位址空間的,所以堆的記憶體空間不是連續的,鍊錶的遍歷也是由低位址到高位址的,所以分配記憶體也是又低位址向高位址分配。

棧:只要棧的剩餘空間大於所申請的空間,系統將為程式提供記憶體,否則將報異常提示棧溢位。

堆:首先應該知道作業系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式的申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該節點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。對於大多數系統,會在這塊記憶體空間中的首位址處記錄本次分配的大小,這樣**中的delete語句才能正確的釋放本記憶體空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動地將對於的那部分重新放入空閒的鍊錶中。

棧:在函式呼叫時,第乙個進棧的是主函式中的下一條指令的位址,然後是函式的各個引數,在大多數c編譯器中,引數是由右向左入棧的,然後是函式中的區域性變數,注意靜態變數是不入棧的,靜態變數儲存在靜態儲存區。當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的位址,也就是主函式中的下一條指令,程式由該點繼續執行。

堆:一般是在堆的頭部用乙個位元組存放堆的大小。堆中的具體內容由程式設計師安排。

棧:由系統自己分配,速度較快,但是程式設計師無法掌握。

堆:一般有兩種方法來申請記憶體,new、和malloc,new是一種用算符而malloc是函式。由程式設計師申請出來的記憶體一般速度比較慢,而卻容易產生記憶體碎片,不過用起來比較方便。

堆的大小取決於作業系統有效的虛擬記憶體的大小,堆獲得空間比較靈活,也相對而言比較大,但是速度慢;棧的話分配記憶體就相對快很多了。

堆和棧區別

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

堆和棧區別

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

堆和棧區別

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