前言
數據結構中,堆(heap)與棧(stack)是兩個常見的數據結構,它們的存在都是為了優化內存,提高使用效率,各有特點,理解二者的定義、用法與區別,能夠利用堆與棧解決很多實際問題。
棧:由操作系統(編譯器)自動分配釋放 ,存放函數的參數值,局部變量的值等
堆:一般由程序員分配釋放, 若程序員不釋放,程序結束時由OS回收
內存分配圖
通過下圖了解常用的堆棧內存分配和增長方向:
增長方向及原因
堆(heap)的增長方向是向上增長,即低地址向高地址增長。
棧(stack)的增長方向是向下增長,即高地址向低地址增長。
堆和棧的增長方向不一致可以讓空閑的內存能最大程度的被使用。
能夠確定棧的起始地址。
從內存分配圖來看,假設棧(stack)的增長方向也是向上增長,那么棧空間的起始位置就要事先固定下來,在棧和堆的總內存大小確定的時候,一個分配多了。另一個分配少了,在不同程序中內存的使用情況不同,有些棧用的多,有些堆用的多。
所以就很有可能出現這種情況:一個程序因為棧溢出而崩潰的時候,其實它還有大量閑置的堆空間沒有被使用,但是我們卻無法使用這些閑置的堆空間。所以最好的辦法就是讓堆和棧一個向上漲,一個向下漲,這樣它們就可以最大程度地共用這塊剩余的地址空間,達到利用率的最大化!
并且在棧和堆的總內存大小已經確定的情況下,不用考慮程序中堆棧的不同使用情況下就能先確定棧的起始地址。
當然,現在的有些芯片在編譯時可以指定棧的增長方向,不過常用的還是向下增長。
-
內存
+關注
關注
8文章
3055瀏覽量
74332 -
數據結構
+關注
關注
3文章
573瀏覽量
40232 -
STACK
+關注
關注
0文章
13瀏覽量
2822
發布評論請先 登錄
相關推薦
STM32 大小端模式 與 堆棧及其增長方向分析
STM32堆棧增長方向問題
UCOSIII任務堆棧和STM32堆棧增長方向是否一致?
MCU堆空間和棧空間的相關資料分享
連接器通常是EMI問題
我們習以為常的IIC通常是什么樣子?資料下載
![我們習以為常的IIC<b class='flag-5'>通常是</b>什么樣子?資料下載](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論