正在编译Release和Debug会生成不同的IL代码+不同的机器代码吗?

Rol*_*oll 9 .net c# vb.net .net-framework-version csc

我听说在Release模式下编译生成的优化代码比在Debug模式下生成,这很好.

但这是IL的优化吗?一旦CLR运行它,它在机器代码中吗?是否与在Release和Debug中编译的PE不同的元数据结构?

谢谢

Han*_*ant 14

在Release版本中构建将打开C#编译器的/ optimize编译选项.这有一些副作用,IL确实改变但不是很多.值得注意的是,编译器不再努力使代码完全可调试.例如,它跳过一个空的静态构造函数,它不再发出NOP操作码,允许您在花括号上设置断点,并允许具有不同范围的局部变量在堆栈帧中重叠.小东西.

最重要的区别是为程序集发出的[Debuggable]属性,其IsJITOptimizerDisabled属性为false.

它开启了真正的优化器,即内置于抖动中的优化器.您将在此答案中找到它执行的优化列表.请注意这种方法的有用性,任何语言都可以从抖动而不是编译器中获得代码优化器.

因此简而言之,IL中的微小变化,生成的机器代码的变化非常大.

  • 很棒的答案. (2认同)