黑马程序员——栈与堆的区别

本文深入解析了.NET中栈和托管堆的区别,包括它们在内存中的分配方式、存储内容及垃圾回收机制。通过示例程序展示了值类型与引用类型变量在栈和堆中的存储情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

栈指堆栈,堆指托管堆。两者是可用内存的两个区域,其中堆栈用于存储非实例变量的值类型数据,以及引用类型的变量(用于存储引用类型实例),而托管堆用于存储引用类型实例的数据及相关信息。不但存储内容不同,堆栈和托管堆的内存分配方式也不同,下面通过一个实例说名两者的区别。

    class Program
    {
        static void Main(string[] args)
        {
            //声明两个Int变量
            int i = 50;
            int i = 80;
            //声明三个引用test实例的变量
            test a = new test();
            test b = new test();
            test c = b;
            //声明ii变量,将i的值赋值给ii
            int ii = i;
            //重新赋值给ii
            ii = 10;
            //声明jj变量,将j变量的值赋值给jj
            int jj = j;
        }
    }
    class test
    {
        //.....
    }


本程序没有任何的输出,实际运行时堆栈和托管堆中的数据存储情况如下图所示:

堆和栈示意图

这是一个简化的示意图,表示本程序数据在内存中的存储情况。堆栈从内存地址高位开始存储数据,而托管堆从内存地址低位开始存储数据。

堆和栈都有相应的指针,指向下一个可用的内存地址,不过两者方向相反,值类型变量的赋值很明显只是赋值了副本,例如i和ii之间独立存在。

引用类型的变量指向实例的实际数据,赋值操作的是同一个实例的地址引用,例如b和c指向相同的test实例。

由此可知,堆栈和托管堆是程序内存空间可用的两个区域。栈用于存储非对象的值类型数据和引用类型实例的地址引用,而堆用于存储由new创建的引用类型的实例,

引用类型变量存储实例的地址引用,已达到访问实例的目的。不过栈的数据清除和堆的数据清除有很大的不同,栈的值类型数据超出了作用域时将被清除,而堆中的实例在没有被任何变量引用时才有可能在某个时间呗清除,堆的数据清除交给垃圾收集器完成。

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值