我试图找出一些 CIL 代码。但这两个语句似乎做同样的事情(根据我所阅读的所有内容)。
ldc.i4 33

ldc.i4.33
两者都应该“将 int32 加载到值 33 的堆栈上”。

这样对吗?为什么?我原以为 ldc.i4.33 会“将一个整数从局部变量索引 33 加载到堆栈上”。

我哪里出错了?

最佳答案

操作码 ldc.i4.33 不存在。

有一些特殊的(称为宏)操作码,来自:

ldc.i4.m1  // has the same effect as: ldc.i4 -1


ldc.i4.8   // has the same effect as: ldc.i4  8

但它们只是 ldc.i4 操作码的一种简短形式,在常见情况下,用于优化 CIL 大小。

类似地, ldloc.0 是一种简短的形式(即具有更紧凑的 CIL 编码,但与 ldloc 0 的作用完全相同)等。

关于.net - CIL - ldc.i4 33 和 ldc.i4.33 有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5840252/

10-12 03:46