首页 > 后端开发 > C++ > 堆与堆栈分配:数组和值类型位于内存中的什么位置?

堆与堆栈分配:数组和值类型位于内存中的什么位置?

Mary-Kate Olsen
发布: 2025-01-02 17:53:44
原创
647 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板