[英]Difference in IL for ref paramters
我试图了解在 IL 级别处理通过引用传递的参数和值的方式之间的区别。
下面是C#中的两种方法
public static void TestRef(ref int x)
{
x++;
}
public static void Test(int x)
{
x++;
}
下面是按值传递的 IL,我知道它加载了 arg,然后加载了 int 常量 1 并将其添加并塞回堆栈中。
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldc.i4.1
IL_0003: add
IL_0004: starg.s x
IL_0006: ret
通过引用传递的方法的 IL:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.0
IL_0003: ldind.i4
IL_0004: ldc.i4.1
IL_0005: add
IL_0006: stind.i4
IL_0007: ret
我不明白为什么有两个ldarg.0
语句。 我假设 IL_0002/3 只是加载参数地址,然后加载该地址的参数值。
但是IL_0001呢? 这与x =x+1
的左侧有关吗?
所加载地址IL_0001: ldarg.0
将由存储操作在被消耗IL_0006: stind.i4
。
msdn 告诉我们有关stind.i4
操作码的信息:
按顺序排列的堆栈过渡行为是:
地址被压入堆栈。
一个值被压入堆栈。
从堆栈中弹出值和地址; 该值存储在地址中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.