天天看點

C++堆和棧的比較

  • 記憶體申請方式不同:
    • 棧:由系統自動配置設定。
    • 堆需要程式員自己申請,是以也需要指明變量的大小。
  • 系統響應的不同:
    • 棧:隻有棧的剩餘空間大于所申請空間,系統将為程式提供記憶體,否則将提示 overflow,也就是棧溢出。
    • 堆:系統收到程式申請空間的要求後,會周遊一個作業系統用于記錄記憶體空閑位址的連結清單,當找到一個空間所申請空間的堆結點後,就會将該結點從記錄記憶體空閑位址的連結清單中删除。并将該結點的記憶體配置設定給程式,然後在這塊記憶體區域的首位址處記錄配置設定的大小,這樣我們在使用delete來釋放記憶體的時候,delete才能正确地識别并删除該記憶體區域的所有變量。另外,我們申請的記憶體空間與堆結點上的記憶體空間不一定相等,這是系統就會自動将堆結點上多出來的那一部分記憶體空間回收到空閑連結清單中。
  • 空間大小的不同:
    • 棧:在WINDOWS下,棧是一塊連續的記憶體的區域,它的大小是2M,也有說是1M,總之該數值是一個編譯時就确定的常數。是由系統預先根據棧頂的位址和棧的最大容量定義為好。假如你的資料申請的記憶體空間超過棧的空間,那麼就會提示overflow。是以,别指望棧能存儲比較大的資料。
    • 堆:不連續的記憶體區域。各塊區域由連結清單将它們串聯起來,這些串聯的記憶體空間叫做堆,它的上限是由系統中有效的虛拟記憶體來定的。是以獲得空間比較大,而且獲得空間的方式比較靈活。
  • 執行效率的不同:
    • 棧:由系統自動配置設定,是以速度比較快。但是程式員不能對其進行操作
    • 堆:由程式員配置設定的記憶體,一般速度比較慢,而且容易産生記憶體碎片,不過用起來很友善。
  • 執行函數時的不同:
    • 棧:在函數調用時,第一個進棧的是被調用函數下一行的記憶體位址。其次是函數的參數,假如參數多于一個,那麼次序是從右往左。最後才是函數的局部變量。             由于棧的先進後出原則,函數結束時正好與其相反,首先是局部變量先出棧,然後是參數,次序是從左到右,這時所有變量都已出棧,指針自然地指到第一個進棧的那行記憶體位址,也就是被調用函數的下一行記憶體位址。程式根據該位址跳轉到被調用函數的下一行自動執行。
      C++堆和棧的比較
      C++堆和棧的比較
      C++堆和棧的比較
               由于棧的先進後出原則,是以她永遠不可能産生記憶體碎片,因為在上面的盤子沒有拿完之前,下面的盤子是不可能抽出的。它們的排序是如此有序,彈出是也非常有序,碎片想要産生也是非常難的。
    • 堆:堆是一大堆不連續的記憶體區域,在系統中由連結清單将它們串接起來,是以在使用的時候必須由程式員來安排。它的機制是很複雜的,有時候為了配置設定一塊合适的記憶體,程式員需要按照一定的算法在堆記憶體中搜尋可以的足夠大小的空間,如果沒有滿足條件的空間,那麼就要向系統發出申請增加一部分記憶體空間,這樣就才有機會分到足夠大小的記憶體,然後将計算後的數值傳回。顯然,堆的運作效率比棧要低得多,而且也容易産生碎片。但是好處是堆可以存儲相當大的資料,并且一些細節可以有程式員來安排。