首頁 > 後端開發 > C++ > 在 C# 中,陣列和值類型如何在堆疊和堆疊上分配?

在 C# 中,陣列和值類型如何在堆疊和堆疊上分配?

Linda Hamilton
發布: 2024-12-29 09:18:11
原創
361 人瀏覽過

How are arrays and value types allocated on the stack and heap in C#?

堆疊與堆疊上的陣列分配和值類型

在您的程式碼片段中:

int[] myIntegers;
myIntegers = new int[100];
登入後複製

當您使用new 關鍵字建立陣列myIntegers,則陣列本身會依照CLR 的建議在堆疊上分配。但是,數組中的整數元素作為值類型,不會裝箱。

堆疊和局部變數

函數中的所有局部變量,包括值類型和參考類型,在堆疊上分配。兩者之間的差異在於這些變數中儲存的內容。

  • 值類型將實際值直接儲存在變數中。
  • 引用型別儲存對值的參考堆,變數本身包含該引用的位址。

RefType 和的範例ValTypes

考慮以下類型:

class RefType {
    public int I;
    public string S;
    public long L;
}

struct ValType {
    public int I;
    public string S;
    public long L;
}
登入後複製

每種類型的值需要16 個位元組的記憶體:4 個位元組用於I,4 個位元組用於S 引用(或實際值) S 字串(ValType),L為 8 個位元組。

如果您有RefType、ValType 和類型的局部變數int[],它們將如下在堆疊上分配:

Stack:

0-3 bytes: RefType variable
4-7 bytes: ValType variable
8-11 bytes: int[] variable
登入後複製

記憶體佈局

為這些變數賦值時:

refType = new RefType();
refType.I = 100;
refType.S = "refType.S";
refType.L = 0x0123456789ABCDEF;

valType = new ValType();
valType.I = 200;
valType.S = "valType.S";
valType.L = 0x0011223344556677;

intArray = new int[4];
intArray[0] = 300;
intArray[1] = 301;
intArray[2] = 302;
intArray[3] = 303;
登入後複製

值將分佈在以下位置方式:

Stack:

0-3 bytes: Heap address of `refType`
4-7 bytes: Value of `valType.I`
8-11 bytes: Heap address of `valType.S`
12-15 bytes: Low 32-bits of `valType.L`
16-19 bytes: High 32-bits of `valType.L`
20-23 bytes: Heap address of `intArray`
登入後複製

堆:

  • 在refType的堆疊位址:

    • 0🎜>0 -3位元組:refType.I的值
    • 4-7位元組:堆疊位址refType.S
    • 8-11 位元組:refType.L
    • 的低32 位元
    12-15 位元組:refType.L
  • 的高32 位

      在intArray 的堆疊上位址:
    • 0-3 個位元組:陣列的長度(4)
    • 4-7 個位元組:intArray[0] 的值(300)
    • 8 -11 位元組:intArray[1] (301)
    • 12-15 位元組:值intArray[2] (302)
    16-19 位元組:intArray[3] (303)
**Passing Arrays**
登入後複製
的值

以上是在 C# 中,陣列和值類型如何在堆疊和堆疊上分配?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板