首頁 >後端開發 >C++ >堆與堆疊分配:數組和值類型位於記憶體中的什麼位置?

堆與堆疊分配:數組和值類型位於記憶體中的什麼位置?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-02 17:53:44649瀏覽

Heap vs. Stack Allocation: Where Do Arrays and Value Types Live in Memory?

堆疊和堆疊分配:分解數組和值類型

在提供的程式碼片段中:

int[] myIntegers;
myIntegers = new int[100];

數組myIntegers是在。與普遍的看法相反,數組中儲存的實際整數值沒有裝箱。

澄清堆疊和堆疊分配

值類型分配在數組上的常見誤解堆上的堆疊和引用類型並不完全準確。所有局部變數和參數,無論類型如何,都在堆疊上分配。主要區別在於這些變數中儲存的內容:

  • 值類型:實際值直接儲存在變數中。
  • 引用types: 儲存在堆疊上的值的參考儲存在變數。

值和引用類型的記憶體分配

值和引用類型都佔用特定的記憶體量,對於提供的範例類型,通常為16 位元組。在此記憶體中:

  • 對於值類型,所有欄位都直接儲存各自的值。
  • 對於引用類型,引用類型欄位儲存位於堆上的值的引用,而值-type 欄位則儲存其實際值。

範例:堆疊和堆疊分配

考慮以下局部變數:

RefType refType;
ValType valType;
int[] intArray;

最初,只有它們的引用駐留在堆疊上,佔用20個位元組:

 0 ┌───────────────────┐
   │     refType       │
 4 ├───────────────────┤
   │     valType       │
   │                   │
   │                   │
   │                   │
20 ├───────────────────┤
   │     intArray      │
24 └───────────────────┘

分配時這些變數的值:

// Assign values to refType
// ...
// Assign values to valType
// ...
intArray = new int[4];
intArray[0] = 300;
// ...
intArray[3] = 303;

堆疊表示將類似於:

 0 ┌───────────────────┐
   │    0x4A963B68     │ -- heap address of `refType`
 4 ├───────────────────┤
   │       200         │ -- value of `valType.I`
   │    0x4A984C10     │ -- heap address of `valType.S`
   │    0x44556677     │ -- low 32-bits of `valType.L`
   │    0x00112233     │ -- high 32-bits of `valType.L`
20 ├───────────────────┤
   │    0x4AA4C288     │ -- heap address of `intArray`
24 └───────────────────┘

陣列以及值和參考類型都佔用堆疊的特定部分,內存佈局如前所述。

總之,陣列 myIntegers 在堆上分配,而儲存在其中的各個整數值沒有裝箱。它們只是直接儲存在堆上分配的記憶體中,無需將它們包裝在其他物件中。

以上是堆與堆疊分配:數組和值類型位於記憶體中的什麼位置?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn