首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 類變量聲明 `Cs cs1;` 到底佔不佔棧空間?圖解引用類型的記憶體模型

     編輯:程式設計綜合問答

初學者常困惑:Cs cs1; 只是聲明引用,為何書上說「存儲在棧上」?本文用記憶體圖解徹底釐清引用變量與對象實例的空間分配關係。

核心結論

  • 變量 `cs1` 本身佔 8 字節(64 位)或 4 字節(32 位),儲存在執行緒棧(或結構體內部、類靜態欄位區)。
  • 此時 `cs1` 的值為 `null`(即全 0 位模式),不指向任何堆對象。
  • 僅聲明不分配堆內存,new Cs() 時才在託管堆分配對象,並將地址寫入 `cs1`。

記憶體快照對比

階段棧堆
Cs cs1;cs1 → 0x00000000 (null)無分配
cs1 = new Cs();cs1 → 0x02A4B8C00x02A4B8C0: [SyncBlockIndex][TypeHandle][欄位...]

為什麼說「存儲在棧上」?

因為變量槽位在棧上。引用類型的「值」是地址,地址本身是值類型,按值類型規則存儲。區分 變量存儲位置(棧/堆/靜態區)與 對象實例存儲位置(永遠在堆),是理解 C# 記憶體模型的關鍵。

驗證代碼

unsafe {
    Cs cs1 = null;
    Console.WriteLine($"cs1 address on stack: {(long)&cs1:X}");
    cs1 = new Cs();
    Console.WriteLine($"cs1 value (heap addr): {(long)Unsafe.AsPointer(ref cs1):X}");
}

輸出會顯示兩個不同地址:前者是棧上槽位,後者是堆上對象。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved