CIL 中有一些加载指令,例如ldc.i4.0
, ldc.i4.1
, ldc.i4.2
, ldc.i4.3
...</p>
我想知道,是否可以使用ldc.i4 1
代替ldc.i4.1
或ldc.i4 5
代替ldc.i4.5
?
是的,使用ldc.i4 1
. 代替是完全合法的ldc.i4.1
。在最常见的场景中,为了效率和简洁性,给出了单字节操作码。特别是,如果它们是(3 个字节) ,所有这些ldarg.0
(1 个字节)将很快加起来显着增加程序集的大小,就像in 之类的东西一样;是 5 个字节而不是 1 个。ldarg 0
ldc.i4.1
i++
ldc.i4 1
您没有义务使用它们。我实际上希望(未经测试)JIT 能够发现更冗长的用法并以同样的方式对待它,尽管它不需要这样做。
就个人而言,当我在做“发射”或类似的事情时,我只是使用一种实用方法来为任何给定的值/本地/参数/等发出最合适的代码。
这是关于 CLR 代码注入的好文章:http: //www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time