堆和棧概念整理

來源:互聯網
上載者:User

1.記憶體管理方式:

     堆:一般由程式員分配釋放,程式員申請時需要指明大小,leg,C語言中malloc函數:p1=(char*)malloc(10),C++中:p2=new char[20].若程式員不去釋放,當程式結束時可能由作業系統釋放 ,注意其與資料結構的堆完全是兩回事,分配方式類似於鏈表,分配釋放的關鍵字:new,malloc,delete,free

     棧:由系統自動分配和釋放,存放函數的參數值,局部變數等等,操作類似於資料結構的棧,eg:生命一個局部變數 int b,系統自動在棧中為其開拓空間

 

2.系統響應:

     堆:OS有一個記錄空閑記憶體位址的鏈表,當OS收到程式的申請時,會遍曆該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程式,另外,對於大多數系統,會在這塊記憶體空間中的首地址處記錄本次分配的大小,這樣代碼中的delete語句才能正確的釋放本記憶體空間。另外由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閑鏈表中。

    棧:只要棧的剩餘空間大於申請空間,系統將為程式提供記憶體,否則將報異常,提示棧溢出

3.分配效率

    堆:是由new分配的記憶體,一般熟讀比較慢,而且容易產生記憶體片段,不過用起來比較方便。

    棧:由系統記憶體自動分配,程式員無法控制,速度較快。

4.存放內容:

    堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容有程式員安排

    棧:存放函數參數(由右往左入棧),函數中的局部變數。(多數C編譯器下)

5.生長方向:

    堆:是由低地址向高地址擴充的資料結構

    棧:由高地址向低地址擴充的資料結構。

 6.片段問題:

   堆:頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的片段,使程式效率降低。

   棧:則不會存在這個問 題, 因為棧是先進後出的隊列,且儲存空間保持林旭。

 7.空間大小:

   堆:一般來講在32位系統下,記憶體可以達到4G的空間,從這個角度來看堆記憶體幾乎是沒有什麼限制的。

   棧:一般都是有一定的空間大小的。

詳見:http://baike.baidu.com/view/93201.htm

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.