堆與棧

    堆」和「棧」是獨立的概念日常說的「堆棧」其實是兩個概念:「堆」和「棧」。在英文中,堆是heap,棧是stack,不知道何時,什麼緣由,在中文裏,這兩個不一樣的概念硬是被搞在一塊兒了,因此,圍繞這個混合詞所發生的誤解和爭執這幾年就沒有斷過。

「棧」通常是由硬件(CPU)實現的,CPU用棧來保存調用子程序(函數)時的返回地址,高級語言有時也用它做爲局部變量的存儲空間。

「堆」是個實實在在的軟件概念,使用與否徹底由編程者「顯示地(explicitly)」決定,如malloc。

程序通過編譯鏈接生成執行程序後,堆和棧的起始地址就已經肯定了(具體說,是經過「鏈接程序」),在一個具備反向增加的棧的CPU上,數據空間可表示以下:

低    ->|-----------------|
      | 全局量(全部已初始化量 .data, |
      | 未初始化量 .bss )       |
  堆起始->|-----------------|
      |    堆向高地址增加      |
      |                 |
      |                 |
      |     自由空間        |
      |                 |
      |                 |
      |    棧向低地址增加      |
高 棧起始->|-----------------|

在內存中,「堆」和「棧」共用所有的自由空間,只不過各自的起始地址和增加方向不一樣,它們之間並無一個固定的界限,若是在運行時,「堆」和「棧」增加到 發生了相互覆蓋時,稱爲「棧堆衝突」,系統確定垮臺。因爲開銷方面的緣由,各類編譯在實現中都沒有考慮解決這個問題,只有靠設計者本身解決,好比增長內存 等。

=================================================================
說明(128爲例)硬堆棧:
即SP,一般彙編中講的所謂堆棧(用於PC指針等壓棧),通常設置從片內RAM的頂部0X10FF開始向下生長,基本上64個足夠足夠了
軟件堆棧:
C編譯器自動分配的堆棧,在硬堆棧和全局變量之間的空間,也是向下生長,通常用於局部變量。好比一個子程序定義一個局部變量A[256],那麼此空間即在 軟堆棧中,假設當前軟堆棧用到0X800,分派A[256]後,軟堆棧用到0X700,A[0]地址爲0X700,A[1]地址爲0X701 ……,固然若是局部變量較少,用寄存器就能夠了,用不着軟堆棧了。此子程序退出後軟堆棧恢復到0X800。
另:你的C程序編譯後,生成的彙編文件中,R28:R29就是軟堆棧指針
編程

相關文章
相關標籤/搜索