程式運行時,它的數據必須存儲在記憶體中。一個數據項需要多大的記憶體、存儲在記憶體中的什麼位置、以及如何存儲都依賴於該數據項的類型。 運行中的程式使用兩個記憶體區域來存儲數據:棧和堆。 棧 棧是一個記憶體數組,是一個 LIFO (Last In First Out,後進先出)的數據結構。棧存儲幾種類型的數據: ...
程式運行時,它的數據必須存儲在記憶體中。一個數據項需要多大的記憶體、存儲在記憶體中的什麼位置、以及如何存儲都依賴於該數據項的類型。
運行中的程式使用兩個記憶體區域來存儲數據:棧和堆。
棧
棧是一個記憶體數組,是一個 LIFO (Last-In First-Out,後進先出)的數據結構。棧存儲幾種類型的數據:
- 某些類型變數的值
- 程式當前的執行環境
- 傳遞給方法的參數
系統管理所有的棧操作。作為程式員,你不需要顯式地對它做任何事情。但瞭解棧的基本功能可以更好地瞭解程式在運行時正在做什麼。
提示: 棧也經常被稱為堆棧,而堆依然稱為堆,所以堆棧這個概念並不包含堆,大家要註意區分。
棧的特征
棧有如下幾個普遍特征:
- 數據只能從棧的頂端插人和刪除
- 把數據放到棧頂稱為入棧(push)
- 從棧頂刪除數據稱為出棧(pop)
堆
堆是一塊記憶體區域,在堆里可以分配大塊的記憶體用於存儲某類型的數據對象。與棧不同,堆里的記憶體能夠以任意順序存人和移除。下圖展示了一個在堆里放了 4 項數據的程式。
雖然程式可以在堆里保存數據,但並不能顯式地刪除它們。CLR 的自動 GC(Garbage Collector,垃圾收集器)在判斷出程式的代碼將不會再訪問某數據項時,自動清除無主的堆對象。我們因此可以不再操心這項使用 C 編程語言時非常容易出錯的工作了。下圖闡明瞭垃圾收集過程。
總結
本篇介紹了棧和堆最最最基本的概念,主要是為下一篇(地址:https://www.vinanysoft.com/c-sharp-basics/data-types/categories-of-types/)介紹值類型和引用類型打基礎。