一、棧和堆:
棧steak(數(shù)據(jù)結(jié)構(gòu)):一種后進先出的的數(shù)據(jù)結(jié)構(gòu)
棧(操作系統(tǒng)):由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
棧使用的是一級緩存, 他們通常都是被調(diào)用時處于存儲空間中,調(diào)用完畢立即釋放。
堆heap(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹,如:堆排序
堆(操作系統(tǒng)): 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收,分配方式類似于鏈表。
堆則是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)。所以調(diào)用這些對象的速度要相對來得低一些。
堆和棧的區(qū)別可以用如下的比喻來看出:
使用棧就象我們?nèi)ワ堭^里吃飯,只管點菜(發(fā)出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。
簡單的來講,棧上分配的內(nèi)存系統(tǒng)自動釋放,堆上分配的內(nèi)存,系統(tǒng)不釋放,哪怕程序退出,那一塊內(nèi)存還是在那里。
棧一般是靜態(tài)分配內(nèi)存,堆一般是動態(tài)分配內(nèi)存。
二、靜態(tài)分配、自動分配、動態(tài)分配:
(1)靜態(tài)分配(棧)
從靜態(tài)存儲區(qū)域分配內(nèi)存。程序編譯的時候內(nèi)存已經(jīng)分配好了,并且在程序的整個運行期間都存在,如靜態(tài)變量和全局變量。
把房間看做一個程序,我們可以把靜態(tài)分配的內(nèi)存當成是房間里的耐用家具。通常,它們無需釋放和回收,因為沒人會天天把大衣柜當作垃圾扔到窗外。
(2)自動分配(棧)
在棧中為局部變量分配內(nèi)存的方法,棧中的內(nèi)存可以隨著代碼塊退出時的出棧操作被自動釋放。例如在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元可以在棧上創(chuàng)建,函數(shù)結(jié)束時這些存儲單元自動被釋放。
這類似于到房間中辦事的人,事情一旦完成,就會自己離開,而他們所占用的空間,也隨著這些人的離開而自動釋放了。
(3)動態(tài)分配(堆)
在堆中動態(tài)分配內(nèi)存空間以存儲數(shù)據(jù)的方式。也就是程序運行時用malloc或new申請的內(nèi)存,我們需要自己用free或delete釋放。
堆中的內(nèi)存塊好像我們喝過的空瓶等,用過了就得扔到垃圾箱里,否則屋內(nèi)就會滿地狼藉。