C# 中的堆和棧

        上存儲的有:值類型引用類型本身

        棧內存就像一系列堆得越來越高的箱子。調用方法是,它的每一個參數都被放入一個箱子,並將這個箱子放到棧的最頂部。每個局部變量也同樣分配到一個箱子,並同樣放到棧的最頂部。方法結束後,它的所有箱子都從棧中移除。
        上存儲的有:引用類型的“對象”可空類型

        堆內存則像散佈在房間裏的一大堆箱子,而不像棧那樣每個箱子都嚴格地堆在另一個箱子上面。每一個箱子都有一個標籤,它標記了這個箱子是否正在使用。創建一個新對象時,runtime 會查找一個空箱子,並把它分配給對象。對對象的引用則存儲在棧上的一個局部變量中。runtime 將跟蹤每個箱子的引用數量(有多個變量引用同一個對象)。一旦最後一個引用消失,runtime 就將箱子標記爲“未使用”。將來某個時候,會清除箱子裏的東西,使之能被真正重用。

        另外,堆內存是一種有限資源,如果被耗盡,new 操作符將拋出一個 OutOfMemoryException ,對象將創建失敗。

        代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace stack_heap
{
    class Program
    {
        static void Main(string[] args)
        {
        }

        void Method(int param)
        {
            Circle c;
            c = new Circle(param);
        }
    }

    class Circle
    { 
        public Circle(int a)
        {           
        }
    }
}
        調用Method 方法時,並給 param 傳遞實參爲 8 後:

1、首先,棧中將分配一小片內存(剛好能存儲一個 int),並用值 8 來初始化。

2、在方法內部,還要從棧中分配出另一小片內存,它剛好能夠存儲一個引用(一個內存地址),只是暫時不進行初始化(它是爲Cricle 類型的變量 c 準備的)。

3、接着從堆中分配一個足夠大的內存區域來容納一個 Circle 對象。

        PS:new 關鍵字執行的操作 --- 它運行 Circle 構造器,將這個原始的堆內存轉換成一個 Circle 對象。

發佈了51 篇原創文章 · 獲贊 17 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章