棧與堆的區別

來源:互聯網
上載者:User

標籤:

                  棧與堆的區別

一、程式所佔用記憶體的分類

    1、棧區(stack):由編譯器自動分配和釋放。存放函數的參數值、局部變數值等。 操作方式類似資料結構的中的棧。

    2、堆區(heap):由程式員分配和釋放(程式員不釋放,程式結束時由os釋放)。其與資料結構中的堆使兩回事。操作方式類似鏈表。

    3、全域區(靜態區)(static):全域變數與靜態變數存放在一塊。程式結束後由系統釋放。

    4、文字常量區:存放常量字串。程式結束後由系統釋放。

    5、程式碼區:存放函數體的二進位代碼。

二、棧與堆的區別

   1、資料結構上的棧與堆

  1)棧:一種“後進先出”性質的資料結構。

  2)堆:一種經過排序的樹形資料結構。

  3)程式的棧與堆和資料結構上的棧與堆有所區別。

    1、申請與回收方式

      1)棧:由系統自動分配和回收。例如:int b;

      2)堆:程式員自己申請,手動回收(C的free(),C++的delete),JAVA虛擬機器自動回收。例如:p = new Font(); 

             //p在棧區,new Font()在堆區(C中的molloc()函索有此功能)

    2、大小限制和響應

      1)棧:在Windows下,棧是向低地址擴充的資料結構,是一塊連續的記憶體空間,最大空間為2M。申請後,只有棧的剩餘空間大於所申請空間,系統為程式提供記憶體。

               如果申請的空間超過棧的剩餘空間,將會提示overflow。

      2)堆:堆是向高地址擴充的資料結構,是一塊不連續的記憶體空間,其空間大小受限於電腦系統中有效虛擬記憶體。因此,堆獲得的空間比較靈活,且較大。申請後,

              程式首先遍曆一個鏈表(該鏈表記錄空閑記憶體位址),直到找到第一個空間大於所申請空間的堆。

   3、申請速度

      1)棧:速度塊,但程式員無法控制。

      2)堆:速度較慢,且容易產生記憶體片段,不過用起來方便。

   4、儲存內容

      1)棧:首先是函數調用後的下一條指令(函索調用語句的下一條可執行語句)的地址,然後是函索的各個參數(由右往左入棧),最後是函數的局部變數。

      2)堆:由程式員安排。

  

棧與堆的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.