1犁功、管理方式不同氓轰;對(duì)于棧來講,是由編譯器自動(dòng)管理浸卦;對(duì)于堆來說署鸡,釋放工作由程序員控制,容易產(chǎn)生內(nèi)存泄漏memory leak限嫌。
2靴庆、空間大小不同;一般來講在32位系統(tǒng)下怒医,堆內(nèi)存可以達(dá)到4G的空間炉抒,從這個(gè)角度來看堆內(nèi)存幾乎是沒有什么限制的。但是對(duì)于棧來講稚叹,一般都是有一定的空間大小的焰薄。
3妻柒、能否產(chǎn)生碎片不同甘改;對(duì)于堆來講违霞,頻繁的new/delete勢必會(huì)造成內(nèi)存空間的不連續(xù)震蒋,從而造成大量的碎片,使程序效率降低野瘦。對(duì)于棧來講描沟,則不會(huì)存在這個(gè)問題,因 為棧是先進(jìn)后出的隊(duì)列鞭光。
4啊掏、生長方向不同;對(duì)于堆來講衰猛,生長方向是向上的迟蜜,也就是向著內(nèi)存地址增加的方向;對(duì)于棧來講啡省,它的生長方向是向下的娜睛,是向著內(nèi)存地址減小的方向增長。
5卦睹、分配方式不同畦戒;堆都是動(dòng)態(tài)分配的,沒有靜態(tài)分配的堆结序。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配障斋。靜態(tài)分配是編譯器完成的,比如局部變量的分配徐鹤。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配垃环,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放返敬,無需我們手工實(shí)現(xiàn)遂庄。
6、分配效率不同劲赠;棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)涛目,計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行凛澎,這就決定了棧的效率比較 高霹肝。堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的塑煎,例如為了分配一塊內(nèi)存沫换,庫函數(shù)會(huì)按照一定的算法在堆內(nèi)存中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由于內(nèi)存碎片太多)轧叽,就有可能調(diào)用系統(tǒng)功能去增加程序數(shù)據(jù)段的內(nèi)存空間苗沧,這樣就有機(jī)會(huì)分到足夠大小的內(nèi)存刊棕,然后進(jìn)行返回炭晒。顯然待逞,堆的效率比棧要低得多。