.net底层知识系列之一:堆栈关系

本文详细介绍了CLR在Windows系统中如何通过托管堆来运行.NET程序的过程。解释了CLR如何分配和管理内存,包括对象的创建过程及不同类型的变量在栈和堆中的存储方式。

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

我写这个并不是我要教给谁,因为我怕误人子弟。。。我只是想堆自己的知识做一个总结并且希望能有人指出我的错误。

首先,要先讲讲clr,clr向windows系统申请一块空间,作为托管堆,clr在托管堆上运行.net程序。在托管堆中,gc垃圾回收器负责对托管堆的管理(创建销毁回收对象,整理托管堆,这方面内容下次讲)。当创建一个对象的时候,即   class1 c = new class1();这个语句其实是需要分三步的。 1   new class1();  即调用class1的构造函数,初始化class1,这个动作在托管堆的表示为:托管堆按照在栈上的类为模版,在堆区创建一个类的对象,初始化其中的成员(调用构造函数,例如把值类型初始化为0,把引用性设置为null。。bool型我没有试过,大家可以写个测试程序试一试)   第二步,申明一个class1类型的变量,c,这个变量是生存在栈上的,并为四个字节的大小(大小由操作系统决定,如果为64位操作系统,则为8个字节)。第三步,把刚才在堆区上创建的对象的起始地址赋给c,即  c = new class1();最后就完成啦。

需要补充的一些东西是:所有的引用类型对象都是在堆区,而所有的值类型都是在栈区。方法体实际上是存活在栈区,但实例方法包含在对象中,对象里存储的是方法在栈区上的地址。堆是由clr管理,对象的生存周期由gc管理,而栈区的变量的存活时间是由其作用域决定的,出了作用域,变量生存期就到了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值