內存中的堆棧

2012-08-28 22:20

關於內存中的堆棧

堆和棧是兩個不同的概念。堆(heap)上分配的內存,系統不釋放,而且是動態分配的。棧(stack)上分配的內存系統會自動釋放,它是靜態分配的。運行時棧叫堆棧。棧的分配是從內存的高地址向低地址分配的,而堆則相反。由malloc或new分配的內存都是從heap上分配的內存,從heap上分配的內存必須有程序員自己釋放,用free來釋放,否則這塊內存會一直被佔用而得不到釋放,就出現了“內存泄露(Memory Leak)”。這樣會造成系統的可分配內存的越來越少,導致系統崩潰。堆棧是一種執行“後進先出”算法的數據結構。設想有一個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裏面,可以發現一種規律:先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以“先進後出”就是這種結構的特點。堆棧就是這樣一種數據結構。它是在內存中開闢一個存儲區域,數據一個一個順序地存入(也就是“壓入——push”)這個區域之中。有一個地址指針總指向最後一個壓入堆棧的數據所在的數據單元,存放這個地址指針的寄存器就叫做堆棧指示器。開始放入數據的單元叫做“棧底”。數據一個一個地存入,這個過程叫做“壓棧”。在壓棧的過程中,每有一個數據壓入堆棧,就放在和前一個單元相連的後面一個單元中,堆棧指示器中的地址自動加1。讀取這些數據時,按照堆棧指示器中的地址讀取數據,堆棧指示器中的地址數自動減 1。這個過程叫做“彈出pop”。如此就實現了後進先出的原則。而堆棧寄存器就是存放堆棧的寄存器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章