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

C# 內存管理深度解析(三):棧幀、參數傳遞與返回值

     編輯:關於C語言

方法調用棧幀結構

  1. 分配棧幀空間:返回地址、參數、局部變量、暫存寄存器。
  2. 參數入棧:值類型拷貝數據,引用類型拷貝引用。
  3. 執行方法體:局部值類型在棧上,引用類型對象在堆,棧存引用。
  4. 返回:值類型拷貝返回值到調用者棧幀,引用類型拷貝引用。
  5. 棧幀彈出:局部變量銷毀,引用類型對象留在堆等待 GC。

值類型參數示例


void Go()
{
    int x = 5;
    AddFive(x); // x 拷貝到參數 pValue
    Console.WriteLine(x); // 5
}
int AddFive(int pValue) { pValue += 5; return pValue; }

調用結束後 pValue 隨棧幀銷毀,x 保持不變。

引用類型返回值示例


class MyInt { public int Val; }
MyInt AddFive(int v)
{
    MyInt r = new MyInt { Val = v + 5 }; // 對象在堆
    return r; // 返回引用拷貝
}

棧幀銷毀後,堆上對象仍存活,由返回的引用訪問,最終由 GC 回收。

值類型與引用類型賦值語義差異


// 值類型:拷貝數據
int x = 3; int y = x; y = 4; // x=3, y=4

// 引用類型:拷貝引用
MyInt x = new MyInt { Val = 3 };
MyInt y = x; // y 指向同一對象
y.Val = 4;   // x.Val 也變為 4

結構體聲明位置決定存儲位置

  • 方法內局部變量 → 棧。
  • 類字段 → 跟隨對象在堆。
  • 靜態字段 → 高頻堆/靜態區。

規則:值類型總出現在聲明它的地方。

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