1. 程式人生 > 其它 >堆區和棧區的區別

堆區和棧區的區別

一、區別

注:首先堆和棧可以分為兩種,一種是資料結構,另一種是和記憶體的分配有關,這兩種雖然都有棧和堆,但是兩者關係並不大,

c語言的記憶體模型分為五個區,分別為:堆區(heap)、棧區(stack)、靜態區、常量區、程式碼區、

棧區和程式碼區其實是一個區。下面這個圖就很明瞭。

棧區主要儲存變數、引用,比如int x;bool y;等等,

  存區速度較快,因為他儲存的都是一些比較簡單的資料,而且他本身的資料介面也比較簡單。儲存的內容會隨著方法的執行完成被銷燬

  每個執行緒都有一個棧

  垃圾回收較為頻繁,因為主要是存方法,方法結束那方法中的引用就結束了

堆主要儲存的是例項物件,比如new 一個物件,

  存取速度比較慢,因為堆記憶體要在程式執行時動態分配記憶體。儲存的內容有程式設計師自己銷燬,如果程式執行完成還沒有銷燬,就自動銷燬。

  而所有執行緒共享一個堆

  垃圾回收不頻繁,只有在一定條件下比如不夠用了才會回收

二、資料結構中的棧和堆

什麼是資料結構?

儲存與組織資料的方式。我感覺更應強調資料的組織方式,比如好多資料結構的儲存方式都是用的陣列,但他們根據自身的特點進行了封裝,因為儲存方式只有順序儲存和鏈式儲存兩種,但是卻可以組合成多種資料結構。 

常用的資料結構有哪些?

陣列、棧、圖、堆、佇列、連結串列等等。

棧是限定僅僅在表尾進行插入和刪除操作的線性表,把允許插入和刪除的一端稱之為棧頂,另外一端稱之為棧底。特點:後進先出,稱之為後進先出線性表。

棧的應用:遞迴。

是一種經過排序的樹形資料結構,每一個節點都有一個值,通常所說堆的資料結構是二叉樹,堆的存取是隨意的。所以堆在資料結構中通常可以被看做是一棵樹的陣列物件。而且堆需要滿足一下兩個性質:
(1)堆中某個節點的值總是不大於或不小於其父節點的值;
(2)堆總是一棵完全二叉樹。

堆的應用:堆排序,快速找出最大值、最小值,簡化時間複雜度,像這樣支援插入元素和尋找最大(小)值元素的資料結構稱之為優先佇列。
————————————————

原文連結:https://blog.csdn.net/panjiapengfly/article/details/102665381