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