C# 中的棧和堆


程序運行時,它的數據必須存儲在內存中。一個數據項需要多大的內存、存儲在內存中的什么位置、以及如何存儲都依賴於該數據項的類型。

運行中的程序使用兩個內存區域來存儲數據:棧和堆。

棧是一個內存數組,是一個 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/)介紹值類型和引用類型打基礎。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM