【引用】C語言編程中的“堆”和“椔甙模”七大不同之處

本文引用地址:[http://www.eepw.com.cn/article/201901/396398.htm]

對于編程初學(xué)者來說會接觸到一些難以理解的名稱,比如堆(heap)暖呕、棧(stack)斜做、堆棧等。初學(xué)開發(fā)過程中往往讓人混淆不清湾揽。今天我們來談?wù)劧押蜅5木唧w區(qū)別瓤逼,來幫助初學(xué)者理清思路。
堆和棧的區(qū)別一直都是永恒的話題库物,為此我也查了很多的資料霸旗,以防自己的理解錯誤,而給他人造成理解偏差戚揭。

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

void function(){

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

}

這是C語言開發(fā)學(xué)習(xí)過程中诱告,必不可免要學(xué)習(xí)的知識,動態(tài)分配一塊空間民晒,空間在堆區(qū)大小是40字節(jié)(32位系統(tǒng)中)精居。而定義的指針變量p是局部變量(在棧區(qū)中 占用4字節(jié)空間),用來存放剛剛前面動態(tài)分配的空間的首地址潜必⊙プ耍可以看出,在這一句代碼中同時包含了棧和堆磁滚,如圖1所示佛吓。


圖1堆和棧

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

  (1)存儲內(nèi)容不同

棧:在函數(shù)調(diào)用時,棧中存放的是函數(shù)中(底下是函數(shù)調(diào)用后的下一條指令)各個參數(shù)(局部變量)垂攘。

堆:一般是在堆的頭部用一個字節(jié)存放堆的大小维雇。堆中的具體內(nèi)容有程序員安排。

  (2)管理方式上不同

棧:由系統(tǒng)自動分配空間搜贤,同時系統(tǒng)自動釋放空間谆沃。 例如,聲明在函數(shù)中一個局部變量 int b; 系統(tǒng)自動在棧中為b開辟空間仪芒,當(dāng)對應(yīng)的生存周期結(jié)束后椦溆埃空間自動釋放耕陷。

堆:需要程序員手動申請并且手動釋放,并指明大小据沈,在C語言中malloc函數(shù)申請哟沫,釋放free函數(shù),在C++中 new和delete實現(xiàn)锌介。

  (3)空間大小不同

棧:獲取空間較小嗜诀。在Windows下,一般大小是1M或2M孔祸,當(dāng)剩余椔「遥空間不足時,分配失敗overflow崔慧。

堆:獲得空間根據(jù)系統(tǒng)的有效虛擬內(nèi)存有關(guān)拂蝎,比較靈活,比較大惶室。

  (4)能否產(chǎn)生碎片不同

棧:不會產(chǎn)生碎片温自,空間連續(xù)。

堆:采用的是鏈表的存儲方式皇钞,會產(chǎn)生碎片悼泌。

  (5)生長方向不同

棧: 向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域夹界。

堆: 向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)馆里,是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的掉盅,自然是不連續(xù)的也拜,而鏈表的遍歷方向是由低地址向高地址。

  (6)分配方式不同

棧:有2種分配方式:靜態(tài)分配和動態(tài)分配趾痘,靜態(tài)由編譯器完成慢哈,例如局部變量;動態(tài)由alloca函數(shù)實現(xiàn),并且編譯器會進(jìn)行釋放永票。

堆: 都是動態(tài)分配的卵贱,沒有靜態(tài)分配的堆。

(7)分配效率不同

棧:由系統(tǒng)自動分配侣集,速度較快键俱。但程序員是無法控制的。

堆:由new分配的內(nèi)存世分,一般速度比較慢编振,而且容易產(chǎn)生內(nèi)存碎片,不過用起來方便臭埋。

以上是棧和堆幾個方面的不同踪央,希望通過上面的資料可以幫助初學(xué)者分清堆和棧臀玄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市畅蹂,隨后出現(xiàn)的幾起案子健无,更是在濱河造成了極大的恐慌,老刑警劉巖液斜,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件累贤,死亡現(xiàn)場離奇詭異,居然都是意外死亡少漆,警方通過查閱死者的電腦和手機(jī)臼膏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來示损,“玉大人讶请,你說我怎么就攤上這事∈合保” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵论巍,是天一觀的道長烛谊。 經(jīng)常有香客問我,道長嘉汰,這世上最難降的妖魔是什么丹禀? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鞋怀,結(jié)果婚禮上双泪,老公的妹妹穿的比我還像新娘。我一直安慰自己密似,他們只是感情好焙矛,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著残腌,像睡著了一般村斟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抛猫,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天蟆盹,我揣著相機(jī)與錄音,去河邊找鬼闺金。 笑死逾滥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的败匹。 我是一名探鬼主播寨昙,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼讥巡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了毅待?” 一聲冷哼從身側(cè)響起尚卫,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尸红,沒想到半個月后吱涉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡外里,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年怎爵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盅蝗。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鳖链,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出墩莫,到底是詐尸還是另有隱情芙委,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布狂秦,位于F島的核電站灌侣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裂问。R本人自食惡果不足惜侧啼,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堪簿。 院中可真熱鬧痊乾,春花似錦、人聲如沸椭更。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甜孤。三九已至协饲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缴川,已是汗流浹背茉稠。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留把夸,地道東北人而线。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膀篮。 傳聞我的和親對象是個殘疾皇子嘹狞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. 基礎(chǔ)知識 1.1、 基本概念誓竿、 功能 馮諾伊曼體系結(jié)構(gòu)1磅网、計算機(jī)處理的數(shù)據(jù)和指令一律用二進(jìn)制數(shù)表示2、順序執(zhí)...
    yunpiao閱讀 5,309評論 1 22
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,101評論 1 32
  • “text segment ”是應(yīng)用程序運行時應(yīng)用程序代碼存在的內(nèi)存段筷屡。每一個指令涧偷,每一個單個函數(shù)、過程毙死、方法和執(zhí)...
    紫云夕月閱讀 7,307評論 4 20
  • 聽了將近一年的各類課程和閱讀各個領(lǐng)域的書籍燎潮,發(fā)現(xiàn)不論是心理學(xué)、儒家國學(xué)扼倘、佛學(xué)确封、愛和自由,還是家庭教育再菊,最終目的都是...
    生之惑閱讀 1,792評論 15 15
  • 好久沒反思爪喘,在預(yù)售中不斷學(xué)習(xí)成長。
    我又沒藍(lán)了閱讀 100評論 0 0