C# (类型、对象、线程栈和托管堆)在运行时的相互关系

时间:2021-08-25 21:38:47

在介绍运行时的关系之前,先从一些计算机基础只是入手,如下图:

C# (类型、对象、线程栈和托管堆)在运行时的相互关系

该图展示了已加载CLR的一个windows进程,该进程可能有多个线程,线程创建时会分配到1MB的栈空间.栈空间用于向方法传递实参,方法定义的局部变量也在实参上,上图的右侧展示了线程的栈内存,栈从高位内存地址向地位内存地址构建.图中线程已经执行了一些代码,栈中已经存在了一些数据(图中阴影部分),现在假定线程执行的代码要调用M1方法.

简单的方法执行前运行时会先执行"序幕"代码,在方法开始前对其进行初始化,然后会执行"尾声"代码,在方法做完工作后对其进行清理,以便返回至其调用者.M1方法开始执行时,它的"序幕"代码在线程栈上分配局部变量的name的内存.如下图所示:

C# (类型、对象、线程栈和托管堆)在运行时的相互关系

然后M1方法调用M2方法,将局部变量name作为实参传递。这造成name局部变量的地址被压入栈