記憶體堆疊
堆疊是一種執行“後進先出”演算法的資料結構。
設想有一個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裡面,可以發現一種規律:先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以“先進後出”就是這種結構的特點。
堆疊就是這樣一種資料結構。它是在記憶體中開闢一個儲存區域,資料一個一個順序地存入(也就是“壓入——push”)這個區域之中。有一個地址指標總指向最後一個壓入堆疊的資料所在的資料單元,存放這個地址指標的暫存器就叫做堆疊指示器。開始放入資料的單元叫做“棧底”。資料一個一個地存入,這個過程叫做“壓棧”。在壓棧的過程中,每有一個資料壓入堆疊,就放在和前一個單元相連的後面一個單元中,堆疊指示器中的地址自動加1。讀取這些資料時,按照堆疊指示器中的地址讀取資料,堆疊指示器中的地址數自動減 1。這個過程叫做“彈出pop”。如此就實現了後進先出的原則。
堆疊是計算機中最常用的一種資料結構,比如函式的呼叫在計算機中是用堆疊實現的。
堆疊可以用陣列儲存,也可以用以後會介紹的連結串列儲存。
下面是一個堆疊的結構體定義,包括一個棧頂指標,一個資料項陣列。棧頂指標最開始指向-1,然後存入資料時,棧頂指標加1,取出資料後,棧頂指標減1。
設想有一個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裡面,可以發現一種規律:先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以“先進後出”就是這種結構的特點。
堆疊就是這樣一種資料結構。它是在記憶體中開闢一個儲存區域,資料一個一個順序地存入(也就是“壓入——push”)這個區域之中。有一個地址指標總指向最後一個壓入堆疊的資料所在的資料單元,存放這個地址指標的暫存器就叫做堆疊指示器。開始放入資料的單元叫做“棧底”。資料一個一個地存入,這個過程叫做“壓棧”。在壓棧的過程中,每有一個資料壓入堆疊,就放在和前一個單元相連的後面一個單元中,堆疊指示器中的地址自動加1。讀取這些資料時,按照堆疊指示器中的地址讀取資料,堆疊指示器中的地址數自動減 1。這個過程叫做“彈出pop”。如此就實現了後進先出的原則。
堆疊是計算機中最常用的一種資料結構,比如函式的呼叫在計算機中是用堆疊實現的。
堆疊可以用陣列儲存,也可以用以後會介紹的連結串列儲存。
下面是一個堆疊的結構體定義,包括一個棧頂指標,一個資料項陣列。棧頂指標最開始指向-1,然後存入資料時,棧頂指標加1,取出資料後,棧頂指標減1。
堆和棧是兩個不同的概念。
簡單的來講堆(heap)上分配的記憶體,系統不釋放,而且是動態分配的。棧(stack)上分配的記憶體系統會自動釋放,它是靜態分配的。執行時棧叫堆疊。棧的分配是從記憶體的高地址向低地址分配的,而堆則相反。
由malloc或new分配的記憶體都是從heap上分配的記憶體,從heap上分配的記憶體必須有程式設計師自己釋放,用free來釋放,否則這塊記憶體會一直被佔用而得不到釋放,就出現了“記憶體洩露(Memory Leak)”。這樣會造成系統的可分配記憶體的越來越少,導致系統崩潰。
題外:很多人認為在程式中儘量使用堆而不使用棧,因為堆疊溢位很危險。其實堆溢位比棧溢位更危險。哈哈~!
簡單的來講堆(heap)上分配的記憶體,系統不釋放,而且是動態分配的。棧(stack)上分配的記憶體系統會自動釋放,它是靜態分配的。執行時棧叫堆疊。棧的分配是從記憶體的高地址向低地址分配的,而堆則相反。
由malloc或new分配的記憶體都是從heap上分配的記憶體,從heap上分配的記憶體必須有程式設計師自己釋放,用free來釋放,否則這塊記憶體會一直被佔用而得不到釋放,就出現了“記憶體洩露(Memory Leak)”。這樣會造成系統的可分配記憶體的越來越少,導致系統崩潰。
題外:很多人認為在程式中儘量使用堆而不使用棧,因為堆疊溢位很危險。其實堆溢位比棧溢位更危險。哈哈~!
相關文章
- Java 堆疊記憶體分配Java記憶體
- JS中堆疊記憶體的練習JS記憶體
- windows核心程式設計--記憶體堆疊Windows程式設計記憶體
- javascript堆疊記憶體分配的區別JavaScript記憶體
- 堆疊和記憶體的關係 細說記憶體
- project中的堆疊記憶體,記憶體地址引用,gc相關問題Project記憶體GC
- JAVA的堆疊和記憶體、垃圾回收解說Java記憶體
- Java堆疊的深度分析及記憶體管理技巧Java記憶體
- jvm 堆記憶體JVM記憶體
- Java堆記憶體Heap與非堆記憶體Non-HeapJava記憶體
- JS中的棧記憶體、堆記憶體JS記憶體
- 直接記憶體和堆記憶體誰快記憶體
- NameNode堆記憶體估算記憶體
- [轉載] Java直接記憶體與堆記憶體Java記憶體
- 堆記憶體和棧記憶體詳解(轉載)記憶體
- java棧記憶體和堆記憶體的詮釋Java記憶體
- JVM堆記憶體詳解JVM記憶體
- JVM堆記憶體設定JVM記憶體
- Tomcat增加堆記憶體Tomcat記憶體
- java 堆外記憶體排查Java記憶體
- 幾個例子理解不同資料型別的堆疊記憶體處理資料型別記憶體
- Java堆外直接記憶體回收Java記憶體
- JVM 堆記憶體設定原理JVM記憶體
- 遺失的JVM堆記憶體JVM記憶體
- 託管堆記憶體佔用記憶體
- C++中“記憶體重疊”C++記憶體
- 深入理解Java的堆記憶體和執行緒記憶體Java記憶體執行緒
- JAVA堆外記憶體排查小結Java記憶體
- JVM堆外記憶體問題排查JVM記憶體
- eclipse設定JVM記憶體堆EclipseJVM記憶體
- jvm堆記憶體和GC簡介JVM記憶體GC
- 探索JVM的垃圾回收(堆記憶體)JVM記憶體
- QT分局管理:堆疊窗體(三)QT
- 【JVM之記憶體與垃圾回收篇】堆JVM記憶體
- Java直接(堆外)記憶體使用詳解Java記憶體
- Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)RedisError記憶體溢位
- Linux堆記憶體管理深入分析Linux記憶體
- JS 堆疊JS