[讨论]这是在干嘛?

ChrisAK 2011-05-13 08:23:52
nop啥的咱还能理解,红色部分实在理解不能.特别是那个
br.s IL_0022
除了浪费点执行时间还有啥用?

.method public hidebysig static object Invoke(class [mscorlib]System.Func`4<bool,int32,string,object> func,
object[] argv) cil managed
{
// 代码大小 36 (0x24)
.maxstack 5
.locals init (object V_0)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: ldc.i4.0
IL_0004: ldelem.ref
IL_0005: unbox.any [mscorlib]System.Boolean
IL_000a: ldarg.1
IL_000b: ldc.i4.1
IL_000c: ldelem.ref
IL_000d: unbox.any [mscorlib]System.Int32
IL_0012: ldarg.1
IL_0013: ldc.i4.2
IL_0014: ldelem.ref
IL_0015: castclass [mscorlib]System.String
IL_001a: callvirt instance !3 class [mscorlib]System.Func`4<bool,int32,string,object>::Invoke(!0,
!1,
!2)
IL_001f: stloc.0
IL_0020: br.s IL_0022
IL_0022: ldloc.0

IL_0023: ret
} // end of method test::Invoke

源程序:
    public static object Invoke(Func<bool,int,string, object> func, object[] argv)
{
return func((bool)argv[0],(int)argv[1],(string)argv[2]);
}


c#编译器版本:

Microsoft(R) Visual C# 2010 编译器 4.0.30319.1 版
...全文
227 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2011-05-13
  • 打赏
  • 举报
回复
路过帮顶了,实在看不懂...
yhnujm##33 2011-05-13
  • 打赏
  • 举报
回复
中间语言。。。。无语。。。帮顶
  • 打赏
  • 举报
回复
IL。。。传说中的IL。。。。对于偶们这些菜鸟来说太高深了。。。。
ChrisAK 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lcl_data 的回复:]

根据2哦4楼得贴子的链接里的讨论,你开优化之后那段il代码就应该没了
[/Quote]测试过了/o+的确没了.
但还是不太理解是干啥的.
nop可以在运行时动态的替换入指令.
这个实在是搞不清在干啥@_@
十八道胡同 2011-05-13
  • 打赏
  • 举报
回复
根据2哦4楼得贴子的链接里的讨论,你开优化之后那段il代码就应该没了
ChrisAK 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lcl_data 的回复:]

此操作不执行任何计算堆栈的行为。

br.s 指令无条件地将控制转移到目标指令。 目标指令表示为一个 1 字节有符号偏移量,此偏移量相对于当前指令的下一条指令的起始位置。

如果目标指令有一个或多个前缀代码,则只能将控制转移到其中的第一个前缀。 此指令无法执行进出 try、catch、filter 和 finally 块的控制转移。

http://msdn.microsoft.c……
[/Quote]汗...指令我能看懂.
主要是它是在干嘛.

首先函数体开始它定义了一个我没定义的变量
object V_0
红色那段相当于
    public static object Invoke(Func<bool,int,string, object> func, object[] argv)
{
object V_0 = func((bool)argv[0],(int)argv[1],(string)argv[2]);
goto ret;
ret:
return V_0;
}

弄了个变量放结果啥的想想是编译器写的也还能理解.但是为啥弄了个毫无意义的goto?
红色那段去掉整个程序执行完全没问题.
十八道胡同 2011-05-13
  • 打赏
  • 举报
回复
此操作不执行任何计算堆栈的行为。

br.s 指令无条件地将控制转移到目标指令。 目标指令表示为一个 1 字节有符号偏移量,此偏移量相对于当前指令的下一条指令的起始位置。

如果目标指令有一个或多个前缀代码,则只能将控制转移到其中的第一个前缀。 此指令无法执行进出 try、catch、filter 和 finally 块的控制转移。

http://msdn.microsoft.com/zh-cn/library/system.reflection.emit.opcodes.br_s.aspx

跳转到下一行 IL_0022: ldloc.0 ?
cjh200102 2011-05-13
  • 打赏
  • 举报
回复
理解不了。

关注。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧