浅谈 值类型和引用类型 在堆和栈中的存储


浅谈 值类型和引用类型 在堆和栈中的存储

简介

本文将简单介绍什么是“栈”(stack)和“堆”(heap),并讨论值类型和引用类型在这两种内存结构中的存储方式。

栈和堆的概念

  • :后入先出(LIFO)的数据结构,由CLR管理,每个线程有自己的栈。
  • :存放较为零散,由Garbage Collector(GC)管理,整个进程共用。

黄金法则

  1. 引用类型总是被分配到“堆”上。
  2. 值类型总是分配到它声明的地方:
    • 作为引用类型的成员变量分配到“堆”上。
    • 作为方法的局部变量时分配到“栈”上。

方法示例

public int AddFive(int pValue) {
    int result;
    result = pValue + 5;
    return result;
}
  • 方法AddFive()及其参数pValue被压入栈。
  • 局部变量result也在栈上分配空间。
  • 方法执行完毕后,栈被清空。

值类型在堆上的分配示例

public class MyInt {
    public int MyValue;
}

public MyInt AddFive(int pValue) {
    var result = new MyInt();
    result.MyValue = pValue + 5;
    return result;
}
  • MyInt为引用类型,分配在堆上,栈上保存指针引用。
  • 函数执行完毕后,栈清空,MyInt类留在堆上,需GC处理。

值类型和引用类型的赋值示例

public int ReturnValue() {
    int x = 3;
    int y = x;
    y = 4;
    return x;
}
  • 返回值是3,因为yx的拷贝,修改y不影响x

引用类型赋值示例

public int ReturnValue() {
    var x = new MyInt();
    x.MyValue = 3;
    MyInt y;
    y = x;
    y.MyValue = 4;
    return x.MyValue;
}
  • 返回值是4,因为xy指向同一对象,修改y.MyValue影响x.MyValue

结语

本文介绍了栈和堆的基本概念以及值类型和引用类型在内存中的存储方式。如果有疑问或错误,欢迎交流。


posted @ 2024-06-19 17:37  梦想航路  阅读(12)  评论(0编辑  收藏  举报