看了IL手册,手册对Dup的解释为:复制计算堆栈上当前最顶端的值,然后将副本推送到计算堆栈上。
如果堆栈上有一个数,顶层为1,执行Dup指令后会发生什么?
IL_0001: ldloc.0 // 将局部变量表的值5推送到计算堆栈,此时计算堆栈最顶端的值为5
IL_0002 dup // 按手册意思,将5的副本再次推送到堆栈,那岂不是说此时堆栈有两个5?
IL_0003: ldc.i4.1 // 将整型数1推送到堆栈
IL_0004: add // 执行加操作, 5 + 1 = 6
IL_0005: stloc.0 // 将结果存储到局部变量表
不太理解计算堆栈的概念
与IL 指令相关的三个概念 :
1 Managed Heap
2 Evaluation Stack
3 Call Stack
只有Evaluation Stack 是栈取数据时是根据栈的特点,先进后出,其它两个都不是栈,可以不按顺序取值
Dup根据IL指令的解释,是复制一份评估栈(Evaluation Stack)上的值并压入评估栈中,
根据你的问题 如果评估栈中最顶端的值为1 那执行Dup指令 则是将1 先复制一份,然后把副本的1压入评估栈中
那么此时评估栈有两个值对吗?最顶端的值为1的副本1,第二个位置的值为原来的1
@天天天蓝_Mr: 没错就是这样的
value 被推送到堆栈上。
从堆栈中弹出 value 以用于复制。
value 被推送回堆栈上。
将重复值推送到堆栈上。
dup 指令重复堆栈的顶层元素,并且将两个相等值留在堆栈顶部。