【引用】C語言編程中的“堆”和“?!逼叽蟛煌?/h2>

本文引用地址:[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é)束后??臻g自動釋放。

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

  (3)空間大小不同

棧:獲取空間較小。在Windows下,一般大小是1M或2M,當(dāng)剩余??臻g不足時,分配失敗overflow。

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

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

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

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

  (5)生長方向不同

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

堆: 向高地址擴展的數(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),并且編譯器會進行釋放。

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

(7)分配效率不同

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容