久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 堆和棧的區別

堆和棧的區別(bie) 時間(jian):2018-08-09      來源:未(wei)知

對于編(bian)程初(chu)學者來(lai)說會接觸到一些難以理解的(de)名稱(cheng),比如堆(dui)(heap)、棧(zhan)(stack)、堆(dui)棧(zhan)(stack)等(deng)。初(chu)學開(kai)發過(guo)程中往(wang)往(wang)讓人(ren)混淆(xiao)不清。今天我們來(lai)談談堆(dui)和棧(zhan)的(de)具(ju)體(ti)區(qu)別(bie),來(lai)幫助初(chu)學者理清思(si)路(lu)。

堆和(he)棧的區(qu)別一(yi)直都(dou)是(shi)永恒的話題,為此我(wo)也查了很多的資料,以(yi)防自己的理解(jie)錯(cuo)誤(wu),而(er)給他人造成理解(jie)偏差。

先從簡單的一個例子引出堆(dui)和棧:

void function(){

int *p = (int *)malloc(10*sizeof(int));

}

這是C語言開發學習過程中,必(bi)不(bu)可(ke)免要學習的(de)(de)知識(shi),動(dong)態分(fen)配(pei)(pei)一(yi)塊空(kong)間(jian),空(kong)間(jian)在堆(dui)區大小是40字(zi)節(32位系統中)。而定義的(de)(de)指針變量(liang)p是局部(bu)變量(liang)(在棧區中 占用4字(zi)節空(kong)間(jian)),用來存(cun)放剛剛前面(mian)動(dong)態分(fen)配(pei)(pei)的(de)(de)空(kong)間(jian)的(de)(de)首地址。可(ke)以看出,在這一(yi)句代碼中同時包含了棧和堆(dui),如圖1所示(shi)。 

圖1堆和棧

我們從以下幾個方面比較一下堆和棧:

(1)存儲內容不同

棧:在函(han)(han)數調(diao)用時,棧中存放的是函(han)(han)數中(底下(xia)是函(han)(han)數調(diao)用后的下(xia)一條指令)各(ge)個(ge)參數(局部(bu)變(bian)量)。

堆:一般是在(zai)堆的(de)頭部用一個字節(jie)存放堆的(de)大小。堆中的(de)具(ju)體內容(rong)有程(cheng)序員安排。

(2)管理方(fang)式上不同

棧:由系(xi)統自(zi)(zi)動(dong)(dong)分(fen)配(pei)空間(jian)(jian),同(tong)時系(xi)統自(zi)(zi)動(dong)(dong)釋放空間(jian)(jian)。 例如,聲(sheng)明(ming)在函數中(zhong)一個局部(bu)變量(liang) int b; 系(xi)統自(zi)(zi)動(dong)(dong)在棧中(zhong)為b開辟空間(jian)(jian),當對應的生存周期結束后棧空間(jian)(jian)自(zi)(zi)動(dong)(dong)釋放。

堆(dui):需要程序(xu)員手動申(shen)請并(bing)且手動釋放(fang),并(bing)指明(ming)大小(xiao),在C語言中(zhong)malloc函(han)數(shu)申(shen)請,釋放(fang)free函(han)數(shu),在C++中(zhong) new和delete實現。

(3)空間大小不同

棧:獲取空(kong)間較小。在Windows下,一(yi)般大小是(shi)1M或2M,當(dang)剩(sheng)余(yu)棧空(kong)間不(bu)足時,分(fen)配失敗overflow。

堆:獲得空間根據(ju)系統的(de)有效虛擬內存有關,比較靈活(huo),比較大。

(4)能否(fou)產生碎片(pian)不(bu)同(tong)

棧:不會產生(sheng)碎片,空間(jian)連續。

堆:采用的是鏈(lian)表的存儲方式,會產生碎片。

(5)生長方向不(bu)同

棧: 向低地址擴展的(de)(de)數據結構,是一塊連續(xu)的(de)(de)內存的(de)(de)區域(yu)。

堆: 向高(gao)地(di)(di)址擴展的(de)(de)數據結構(gou),是不連續的(de)(de)內存區域。這是由(you)于系統是用(yong)鏈表來存儲的(de)(de)空閑內存地(di)(di)址的(de)(de),自然是不連續的(de)(de),而鏈表的(de)(de)遍歷方向是由(you)低地(di)(di)址向高(gao)地(di)(di)址。

(6)分配方式(shi)不(bu)同

棧:有2種分配方式:靜態(tai)分配和動態(tai)分配,靜態(tai)由編譯器完成,例如局(ju)部(bu)變量;動態(tai)由alloca函數實現,并且編譯器會進行(xing)釋放(fang)。

堆(dui): 都是動態分配的(de),沒有靜態分配的(de)堆(dui)。

(7)分配效率不同(tong)

棧:由系統自動分配,速度較快。但程序員(yuan)是無法控制的(de)。

堆:由new分配的內存,一般(ban)速(su)度比較慢,而且容易產生內存碎(sui)片,不過用起(qi)來方便(bian)。

以上是棧和(he)堆(dui)幾個方面(mian)(mian)的不(bu)同,希望通(tong)過上面(mian)(mian)的資料可以幫助初(chu)學者分清堆(dui)和(he)棧。

上一篇:新ARM處理器架構

下一篇:分頻器設計原理淺析

熱點文章推(tui)薦
華清(qing)學(xue)員就業(ye)榜單(dan)
高薪學員經驗分享
熱點新(xin)聞(wen)推薦
前臺專線(xian):010-82525158 企業培訓洽談專線:010-82525379 院(yuan)校合(he)作洽談專(zhuan)線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部