首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 資料在記憶體中的儲存方式:堆疊 vs 堆積、實值/參考型別、Boxing/Unboxing 完整圖解

     編輯:關於C#

記憶體模型核心概念

概念堆疊堆積
管理方式LIFO、編譯器/執行期自動GC 追蹤、非連續配置
配置速度極快 (指標遞增)較慢 (搜尋空閒區塊)
存活期方法/區塊返回即釋放GC 判定不可觸及回收
大小限制~1MB (執行緒堆疊)虛擬記憶體上限
存放內容區域變數、參數、回傳位址、實值型別實例參考型別物件、陣列、委派、閉包、String、Boxed 實值型別

實值型別 vs 參考型別儲存差異

// 實值型別:直接包含資料
int a = 10;           // 堆疊:[10]
struct Point { int X, Y; }
Point p = new Point(); // 堆疊:[0, 0] (預設值)
Point p2 = p;         // 複製:堆疊新增 [0, 0]

// 參考型別:變數存參考,物件在堆積
class Person { public string Name; }
Person p1 = new Person(); // 堆疊:[ref] → 堆積:[Name=null]
Person p2 = p1;           // 複製參考:堆疊新增 [ref] → 同一堆積物件
p2.Name = "John";         // p1.Name 也變 "John"

Boxing 與 Unboxing

int val = 42;
object boxed = val;      // Boxing: 配置堆積物件、複製值、存參考
int unboxed = (int)boxed; // Unboxing: 檢查型別、複製值回堆疊

// 效能影響:配置記憶體、GC 壓力、複製開銷
// 避免:泛型集合 List vs ArrayList、介面呼叫裝箱
List list = new List(); // 無裝箱
list.Add(42);                     // 直接存儲
ArrayList aList = new ArrayList(); // 裝箱
aList.Add(42);                    // 配置物件、複製

記憶體圖解:方法呼叫框架

Thread Stack (向下增長)
┌─────────────────────┐
│ Main Frame          │ ← Stack Pointer (RSP/ESP)
│  - args             │
│  - locals: a=10     │
│  - ref: p1 ─────────┼──┐
└─────────────────────┘  │
                         ▼
Managed Heap
┌─────────────────────┐
│ Person Object       │
│  - TypeHandle       │
│  - SyncBlockIndex   │
│  - Name = "John"    │ ← p1, p2 參考此處
└─────────────────────┘

進階:Span/Memory/stackalloc

// stackalloc: 堆疊配置陣列 (C# 7.2+ 安全語境)
Span stackArray = stackalloc int[100]; // 無 GC、極快、大小受限

// Memory: 可跨非同步邊界的緩衝區抽象
Memory buffer = new byte[4096];
await stream.ReadAsync(buffer); // 直接寫入

// 字串切片零複製
ReadOnlySpan slice = "Hello World".AsSpan(6, 5); // "World"

最佳實務總結

  • 小型、不可變、高頻複製 → 結構體 (實值型別)
  • 大型、可變、身分識別重要 → 類別 (參考型別)
  • 熱路徑避免裝箱:泛型、Span、實值型別介面約束
  • 大量短暫物件 → stackalloc / ArrayPool / ObjectPool
  • 記憶體診斷:dotnet-gcdump, dotnet-trace, BenchmarkDotNet

堆疊堆積
實值參考
Boxing

本文對應《叩響 C# 之門》第 1.6 節資料和記憶體教學內容

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