對于編程初學者來說會接觸到一些難以理解的名稱,比如堆(heap)、堆疊(stack)、堆疊(stack)等,初學開發程序中往往讓人混淆不清,
今天我們來談談堆和堆疊的具體區別,來幫助初學者理清思路,
堆和堆疊的區別一直都是永恒的話題,為此我也查了很多的資料,以防自己的理解錯誤,而給他人造成理解偏差,

先從簡單的一個例子引出堆和堆疊:
void function()
{
int *p = (int *)malloc(10*sizeof(int));
}
這是C語言開發學習程序中,必不可免要學習的知識,動態分配一塊空間,空間在堆區大小是40位元組(32位系統中),
而定義的指標變數p是區域變數(在堆疊區中 占用4位元組空間),用來存放剛剛前面動態分配的空間的首地址,
可以看出,在這一句代碼中同時包含了堆疊和堆,如圖所示,
堆和堆疊
我們從以下幾個方面比較一下堆和堆疊:
? 存盤內容不同
堆疊:在函式呼叫時,堆疊中存放的是函式中(底下是函式呼叫后的下一條指令)各個引數(區域變數),
堆:一般是在堆的頭部用一個位元組存放堆的大小,堆中的具體內容有程式員安排,
? 管理方式上不同
堆疊:由系統自動分配空間,同時系統自動釋放空間,例如,宣告在函式中一個區域變數 int b; 系統自動在堆疊中為b開辟空間,當對應的生存周期結束后堆疊空間自動釋放,
堆:需要程式員手動申請并且手動釋放,并指明大小,在C語言中malloc函式申請,釋放free函式,在C++中 new和delete實作,
? 空間大小不同
堆疊:獲取空間較小,在Windows下,一般大小是1M或2M,當剩余堆疊空間不足時,分配失敗overflow,
堆:獲得空間根據系統的有效虛擬記憶體有關,比較靈活,比較大,
? 能否產生碎片不同
堆疊:不會產生碎片,空間連續,
堆:采用的是鏈表的存盤方式,會產生碎片,
? 生長方向不同
堆疊:向低地址擴展的資料結構,是一塊連續的記憶體的區域,
堆:向高地址擴展的資料結構,是不連續的記憶體區域,這是由于系統是用鏈表來存盤的空閑記憶體地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址,
? 分配方式不同
堆疊:有2種分配方式:靜態分配和動態分配,靜態由編譯器完成,例如區域變數;動態由alloca函式實作,并且編譯器會進行釋放,
堆:都是動態分配的,沒有靜態分配的堆,
? 分配效率不同
堆疊:由系統自動分配,速度較快,但程式員是無法控制的,
堆:由new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來方便,

以上是堆疊和堆幾個方面的不同,希望通過上面的分享可以幫助初學者分清堆和堆疊,
看到這里你是不是對“C語言”又有了一點新的了解~
如果你也想學C語言,小編推薦一個程式員編程學習基地【點擊進入】!
涉及到:C語言、C++、windows編程、網路編程、QT界面開發、Linux編程、游戲編程、黑客等等......

編程入門資料:

?推薦學習書籍:

一個活躍、高逼格、高層次的編程學習殿堂;編程入門只是順帶,思維的提高才有價值!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/185759.html
標籤:其他
