[轉]內存中堆和棧的區別

轉:https://my.oschina.net/aofe/blog/267882程序員

堆和棧的區別:數據結構

·      1> 堆空間的內存是動態分配的,通常存放對象,而且須要手動釋放內存。須要程序員本身申請而且指明大小,如C語言的malloc函數。函數

·      2> 棧空間的內存由系統自動分配,通常存放局部變量等,不須要手動管理內存。例如聲明函數中的一個局部變量int b,系統在棧中自動爲b開闢空間。.net

接下來我將從如下幾個方面來闡述堆與棧的區別;對象

    管理方式:blog

        對於棧來說,由編譯器自動管理,無需咱們手動控制。隊列

        對於堆來講,釋放工做由程序員控制,容易產生memory warning。內存

    申請大小:編譯器

        棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存區域.即棧頂的地址和棧的最大容量是系統預先規好的。棧的大小是1M,若是申請空間超過棧的剩餘空間時,將提示overflow.所以,能從棧得到的空間較小。編譯

        堆:堆是向高地址擴展的數據結構,是不連續的內存區域.這是由於系統是用鏈表來存儲空閒內存地址的,天然是不連續的,而鏈表的遍歷方向是由低地址向高地址.堆得大小受限於計算機系統中有效地虛擬內存.因而可知,堆得到的空間比較靈活,也比較大。

    碎片問題:

        對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。

        對於棧來說,則不會存在這個問題,由於棧是先進後出得隊列,它們是如此的一一對應,以致於永遠都不可能有一個內存塊從棧中間彈出。

    分配方式:

        堆都是動態分配的,沒有靜態分配的堆。

        棧有兩種分配方式:靜態分配和動態分配.靜態分配是編譯器完成的,好比局部變量的分配.動態分配由alloc函數進行分配,可是棧的動態分配和堆是不一樣的,它的動態分配是由編譯器進行釋放,無需咱們手工實現。

    分配效率:

        棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。

        堆則是C/C++函數庫提供的,它的機制是很複雜的。

相關文章
相關標籤/搜索