標籤:
棧與堆的區別
一、程式所佔用記憶體的分類
1、棧區(stack):由編譯器自動分配和釋放。存放函數的參數值、局部變數值等。 操作方式類似資料結構的中的棧。
2、堆區(heap):由程式員分配和釋放(程式員不釋放,程式結束時由os釋放)。其與資料結構中的堆使兩回事。操作方式類似鏈表。
3、全域區(靜態區)(static):全域變數與靜態變數存放在一塊。程式結束後由系統釋放。
4、文字常量區:存放常量字串。程式結束後由系統釋放。
5、程式碼區:存放函數體的二進位代碼。
二、棧與堆的區別
1、資料結構上的棧與堆
1)棧:一種“後進先出”性質的資料結構。
2)堆:一種經過排序的樹形資料結構。
3)程式的棧與堆和資料結構上的棧與堆有所區別。
1、申請與回收方式
1)棧:由系統自動分配和回收。例如:int b;
2)堆:程式員自己申請,手動回收(C的free(),C++的delete),JAVA虛擬機器自動回收。例如:p = new Font();
//p在棧區,new Font()在堆區(C中的molloc()函索有此功能)
2、大小限制和響應
1)棧:在Windows下,棧是向低地址擴充的資料結構,是一塊連續的記憶體空間,最大空間為2M。申請後,只有棧的剩餘空間大於所申請空間,系統為程式提供記憶體。
如果申請的空間超過棧的剩餘空間,將會提示overflow。
2)堆:堆是向高地址擴充的資料結構,是一塊不連續的記憶體空間,其空間大小受限於電腦系統中有效虛擬記憶體。因此,堆獲得的空間比較靈活,且較大。申請後,
程式首先遍曆一個鏈表(該鏈表記錄空閑記憶體位址),直到找到第一個空間大於所申請空間的堆。
3、申請速度
1)棧:速度塊,但程式員無法控制。
2)堆:速度較慢,且容易產生記憶體片段,不過用起來方便。
4、儲存內容
1)棧:首先是函數調用後的下一條指令(函索調用語句的下一條可執行語句)的地址,然後是函索的各個參數(由右往左入棧),最後是函數的局部變數。
2)堆:由程式員安排。
棧與堆的區別