首页 > 后端开发 > 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-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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板