棧區(qū)屬于線程自己占有(在棧區(qū)聪舒,系統(tǒng)以棧的形式管理函數(shù)調(diào)用,臨時數(shù)據(jù),返回地址等信息色罚,先進(jìn)后出??? 當(dāng)前調(diào)用的函數(shù)在棧頂?shù)奈恢茫?/p>
堆區(qū)屬于同屬于同一進(jìn)程的線程共享
—————————————————————————————————————————
管理方式:對于棧來講,是由編譯器自動管理赋除,無需我們手工控制阱缓;對于堆來說,釋放工作由程序員控制举农,容易產(chǎn)生memory leak茬祷。
申請大小:
棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)并蝗,是一塊連續(xù)的內(nèi)存的區(qū)域祭犯。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在WINDOWS下滚停,棧的大小是2M(也有的說是1M沃粗,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時键畴,將提示overflow最盅。因此,能從棧獲得的空間較小起惕。
堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)涡贱,是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的惹想,自然是不連續(xù)的问词,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存嘀粱。由此可見激挪,堆獲得的空間比較靈活,也比較大锋叨。
碎片問題:對于堆來講垄分,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù),從而造成大量的碎片娃磺,使程序效率降低薄湿。對于棧來講,則不會存在這個問題偷卧,因為棧是先進(jìn)后出的隊列豺瘤,他們是如此的一一對應(yīng),以至于永遠(yuǎn)都不可能有一個內(nèi)存塊從棧中間彈出
分配方式:堆都是動態(tài)分配的涯冠,沒有靜態(tài)分配的堆炉奴。棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器完成的蛇更,比如局部變量的分配瞻赶。動態(tài)分配由alloca函數(shù)進(jìn)行分配赛糟,但是棧的動態(tài)分配和堆是不同的,他的動態(tài)分配是由編譯器進(jìn)行釋放砸逊,無需我們手工實現(xiàn)璧南。
分配效率:棧是機器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址师逸,壓棧出棧都有專門的指令執(zhí)行司倚,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫提供的篓像,它的機制是很復(fù)雜的动知。
堆和棧.png