堆和堆栈分配:分解数组和值类型
在提供的代码片段中:
int[] myIntegers; myIntegers = new int[100];
数组 myIntegers 是在堆。与普遍的看法相反,数组中存储的实际整数值没有装箱。
澄清堆栈和堆分配
值类型分配在数组上的常见误解堆上的堆栈和引用类型并不完全准确。所有局部变量和参数,无论类型如何,都在堆栈上分配。主要区别在于这些变量中存储的内容:
值和引用类型的内存分配
值和引用类型都占用特定的内存量,对于提供的示例类型,通常为 16 字节。在此内存中:
示例:堆栈和堆分配
考虑以下局部变量:
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中文网其他相关文章!