為何堆和棧的增長方向通常是相反的?
掃描二維碼
隨時隨地手機看文章
前言
數(shù)據(jù)結(jié)構(gòu)中,堆(heap)與棧(stack)是兩個常見的數(shù)據(jù)結(jié)構(gòu),它們的存在都是為了優(yōu)化內(nèi)存,提高使用效率,各有特點,理解二者的定義、用法與區(qū)別,能夠利用堆與棧解決很多實際問題。
棧:由操作系統(tǒng)(編譯器)自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等
堆:一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時由OS回收
內(nèi)存分配圖
通過下圖了解常用的堆棧內(nèi)存分配和增長方向:
增長方向及原因
堆(heap)的增長方向是向上增長,即低地址向高地址增長。
棧(stack)的增長方向是向下增長,即高地址向低地址增長。
堆和棧的增長方向不一致可以讓空閑的內(nèi)存能最大程度的被使用。
能夠確定棧的起始地址。
從內(nèi)存分配圖來看,假設(shè)棧(stack)的增長方向也是向上增長,那么??臻g的起始位置就要事先固定下來,在棧和堆的總內(nèi)存大小確定的時候,一個分配多了。另一個分配少了,在不同程序中內(nèi)存的使用情況不同,有些棧用的多,有些堆用的多。
所以就很有可能出現(xiàn)這種情況:一個程序因為棧溢出而崩潰的時候,其實它還有大量閑置的堆空間沒有被使用,但是我們卻無法使用這些閑置的堆空間。所以最好的辦法就是讓堆和棧一個向上漲,一個向下漲,這樣它們就可以最大程度地共用這塊剩余的地址空間,達到利用率的最大化!
并且在棧和堆的總內(nèi)存大小已經(jīng)確定的情況下,不用考慮程序中堆棧的不同使用情況下就能先確定棧的起始地址。
當然,現(xiàn)在的有些芯片在編譯時可以指定棧的增長方向,不過常用的還是向下增長。





