CSharp之堆栈

程序运行时的内存结构

程序运行时分为三个部分

  • 托管堆--------用来存放引用类型对象
  • 调用堆栈------用来存放有序的调用方法及值类型和指针
  • 计算堆栈------指令运算时的堆栈

IL语言中的调用堆栈过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Program
{
static void Main(string[] args)
{
int x = 2;
int y = 3;
int z = Add(x, y);
}
static int Add(int a,int b)
{
int sum;
sum = a + b;
return sum;
}
}

IL代码如下所示
images
接下来逐步解析

步骤序号 指令 描述
IL_0000 nop 不作任何处理
IL_0001 ldc.i4.2 在计算堆栈上开辟4位空间存放数植2
IL_0002 stloc.0 将计算堆栈上的值推送到调用栈的参数0位置
IL_0003 ldc.i4.3 在计算堆栈上开辟4位空间存放数植3
IL_0004 stloc.1 将计算堆栈上的值推送到调用栈的参数1位置
IL_0005 ldloc.0 将调用栈上0位置的值复制到计算堆栈
IL_0006 ldloc.1 将调用栈上0位置的值复制到计算堆栈
IL_0007 call 使计算堆栈上的值作为参数调用相加方法
IL_000c stloc.2 将计算堆栈上的值推动到调用栈的参数2位置
IL_000d ret 返回
images