摘要:堆與棧棧由編譯器自動(dòng)分配存放函數(shù)的參數(shù)值局部變量的值等其操作方式類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的棧堆一般由程序員分配釋放若程序員不釋放程序結(jié)束時(shí)可能由回收這里是指操作系統(tǒng)區(qū)別和聯(lián)系申請(qǐng)方式堆由程序員自己申請(qǐng)并指明大小在語(yǔ)言中的函數(shù)棧由系統(tǒng)自動(dòng)分配聲明在函
堆與棧
棧(stack): 由編譯器自動(dòng)分配, 存放函數(shù)的參數(shù)值, 局部變量的值等. 其操作方式類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的棧.
堆(heap): 一般由程序員分配釋放, 若程序員不釋放, 程序結(jié)束時(shí)可能由OS回收. 這里OS是指: 操作系統(tǒng)(Operating System)
區(qū)別和聯(lián)系:
申請(qǐng)方式
堆: 由程序員自己申請(qǐng)并指明大小, 在c語(yǔ)言中的malloc函數(shù). eg: p1 = (char *)malloc(10);
棧: 由系統(tǒng)自動(dòng)分配, eg: 聲明在函數(shù)中的一個(gè)局部變量int b; 系統(tǒng)自動(dòng)在棧中為b開(kāi)辟空間;
申請(qǐng)后系統(tǒng)的響應(yīng)
堆: 首先應(yīng)該知道操作系統(tǒng)有一個(gè)記錄空閑內(nèi)存地址的鏈表, 當(dāng)系統(tǒng)收到程序的申請(qǐng)時(shí), 會(huì)遍歷該鏈表, 尋找第一個(gè)空間大于所申請(qǐng)空間的堆結(jié)點(diǎn), 然后將該結(jié)點(diǎn)從空閑結(jié)點(diǎn)鏈表中刪除, 并將該結(jié)點(diǎn)的空間分配給程序, 對(duì)于大多數(shù)系統(tǒng), 會(huì)在這塊內(nèi)存空間中的首地址處記錄本次分配的大小, 這樣代碼中的delete語(yǔ)句才能正確的釋放本內(nèi)存空間. 另外, 由于找到的堆節(jié)點(diǎn)的大小不一定正好等于申請(qǐng)的大小, 系統(tǒng)會(huì)自動(dòng)的將多余的那部分重新放入空閑鏈表中.
棧: 只要棧的剩余空間大于所申請(qǐng)空間, 系統(tǒng)將為程序員提供內(nèi)容, 否則將異常提示棧溢出;
申請(qǐng)大小的限制
堆: 向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu), 是不連續(xù)的內(nèi)存區(qū)域. 這是由于系統(tǒng)是用鏈表來(lái)存儲(chǔ)空閑內(nèi)存地址的, 自然是不連續(xù)的, 而鏈表的遍歷方向是由低地址向高地址. 堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存. 由此可見(jiàn), 堆獲得的空間比較靈活, 也比較大.
棧: 在Windows下, 棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu), 是一塊聯(lián)系的內(nèi)存區(qū)域. 這句話(huà)的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的, 在Windows下, 棧的大小是2M(也有人說(shuō)1M, 總之是一個(gè)編譯時(shí)就確定的常數(shù)), 如果申請(qǐng)的空間超過(guò)棧的剩余空間, 將提示overflow. 因此, 能從棧獲得的空間較小.
申請(qǐng)效率
堆: 由new分配的內(nèi)存, 一般速度比較慢, 而且容易產(chǎn)生內(nèi)存碎片, 不過(guò)用起來(lái)最方便;
棧: 系統(tǒng)自動(dòng)分配, 速度較快. 但是程序員無(wú)法控制;
前方高能!通俗易懂的方式來(lái)解釋堆與棧之間的區(qū)別
區(qū)別一(who)
堆: 可以把堆理解為 土堆 , 堆是由程序員負(fù)責(zé)分配和釋放的. 而程序員又被稱(chēng)為碼農(nóng), 即為 農(nóng)名_(這里沒(méi)有任何鄙視農(nóng)名的意思, 我的爸媽也是農(nóng)名, 這里只是作為一種便于理解的比喻), _農(nóng)名 就是種地的(操作 _土堆_).
棧: 可以把棧理解為 書(shū) , 讀書(shū)人有知識(shí)、文化, 什么都是自動(dòng)的、高科技, 所以棧是不用 農(nóng)名 關(guān)心的, 由操作系統(tǒng)自己去申請(qǐng)和釋放的.
區(qū)別二(where)
堆: 可以想象 土堆 被操作時(shí) 肯定沒(méi)有那么智能化, 所以分配的時(shí)候會(huì)去查找合適的空間, 能找到放下 土堆 的容量的內(nèi)存塊的時(shí)候就分配給你.
棧: 書(shū) 是很智能化的, 所以操作系統(tǒng)會(huì)直接給你了.
區(qū)別三(how)
堆: 土堆 只能夠從地上往上堆, 不可能相反, 那樣的土堆除非有502(膠水). 所以是從下往上分配地址的.
棧: 書(shū) 我們可以想象成一個(gè)未來(lái)的圖書(shū)館, 圖書(shū)館把 書(shū) 都放在天花板上, 從上往下放, 而且不會(huì)掉下來(lái). 所以棧的分配是自頂向下的, 而且坑定有空間限制. 所以如果棧上空間不足了就overflow了.
區(qū)別四(result)
堆: 土堆 農(nóng)業(yè)相關(guān), 所以什么都比較慢, 所以分配就比較慢了, 而且到處都是 小土堆 , 這就是碎片.
棧: 書(shū) 高科技的, 當(dāng)然分配就很快, 至少比堆快, 而且不會(huì)有碎片, 人家是高科技的產(chǎn)物.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/108254.html
摘要:棧因?yàn)槭沁\(yùn)行單位,因此里面存儲(chǔ)的信息都是跟當(dāng)前線(xiàn)程相關(guān)的信息。基本類(lèi)型和對(duì)象的引用都是在存放在棧中,而且都是幾個(gè)字節(jié)的一個(gè)數(shù),因此在程序運(yùn)行時(shí),他們的處理方式是統(tǒng)一的。對(duì)象,是由基本類(lèi)型組成的。 一、概念 數(shù)據(jù)類(lèi)型 java虛擬機(jī)中,數(shù)據(jù)類(lèi)型可以分為兩類(lèi): 基本類(lèi)型 引用類(lèi)型 基本類(lèi)型的變量保存原始值,即:他代表的值就是數(shù)值本身;而引用類(lèi)型的變量保存引用值。基本類(lèi)型包括:byte,sh...
摘要:中對(duì)內(nèi)存的一些了解在進(jìn)行開(kāi)發(fā)的過(guò)程中了解內(nèi)存機(jī)制有助于開(kāi)發(fā)人員能夠清晰的認(rèn)識(shí)到自己寫(xiě)的代碼在執(zhí)行的過(guò)程中發(fā)生過(guò)什么也能夠提高項(xiàng)目的代碼質(zhì)量?jī)?nèi)存是怎么樣的中變量存放有著原始值與引用值之分原始值原始的數(shù)據(jù)類(lèi)型以及新加入的引用值等類(lèi)型的值便是引用 JS中對(duì)內(nèi)存的一些了解 在JS進(jìn)行開(kāi)發(fā)的過(guò)程中, 了解JS內(nèi)存機(jī)制有助于開(kāi)發(fā)人員能夠清晰的認(rèn)識(shí)到自己寫(xiě)的代碼在執(zhí)行的過(guò)程中發(fā)生過(guò)什么, 也能夠提高...
摘要:百度百科上對(duì)堆和棧進(jìn)行了對(duì)比分析堆棧空間分配棧操作系統(tǒng)由操作系統(tǒng)自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。堆棧緩存方式棧使用的是一級(jí)緩存,他們通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中,調(diào)用完畢立即釋放。顯然,堆的效率比棧要低得多。 相信很多程序員對(duì)于堆和棧的概念,總是感覺(jué)很朦朧,感覺(jué)在哪里聽(tīng)過(guò)見(jiàn)過(guò),并沒(méi)有深交。 在計(jì)算機(jī)領(lǐng)域,堆棧是一個(gè)不容忽視的概念,我們編寫(xiě)的C語(yǔ)言程序基本上都要用到。但...
閱讀 2517·2023-04-25 17:37
閱讀 1196·2021-11-24 10:29
閱讀 3704·2021-09-09 11:57
閱讀 701·2021-08-10 09:41
閱讀 2251·2019-08-30 15:55
閱讀 2820·2019-08-30 15:54
閱讀 1950·2019-08-30 15:53
閱讀 904·2019-08-30 15:43