【发布时间】:2016-06-30 20:26:11
【问题描述】:
这段代码的IL代码(用https://dotnetfiddle.net生成):
public class Program
{
public static void Main()
{
int i = 10;
if (i < 4)
Console.WriteLine("Hello World");
}
}
包含 ldstr "Hello World"。
编译器不应该知道 Console.WriteLine 永远不会被执行吗?
这个的IL代码:
public class Program
{
public static void Main()
{
if (10 < 4)
Console.WriteLine("Hello World");
}
}
不包含 ldstr 命令。
现在我很困惑.. .NET 编译器真的那么愚蠢吗? 两个示例的 C#/IL 代码完全相同:什么都没有。但是第一个例子的 IL 代码比另一个大。一个好的编译器不应该只调用构造函数而什么都不做吗?
编辑:
是的,我已经阅读了this,但我不是在谈论其他生成的本地人。
如果i 是属性或公共变量,则可以从另一个线程对其进行修改。但是i只存在于Main()中...
【问题讨论】:
-
您是否尝试过开启和关闭优化?调试/发布模式。
-
开启max优化和Release模式后,看看JIT生成了什么代码。那会很有趣。
-
如果您在调试器中使用您的第一个代码 sn-p,则可以在
int i = 10;和if (i < 4)之前立即停止。在这种情况下,调试器可以更改i的值,并且必须评估 if 语句的结果。 -
永远不要说编译器是愚蠢的。这些野兽拥有超人的能力。如果您查看该网站上无数声称存在编译器错误的帖子,您就会明白我的意思。
-
@YvesDaoust 编译器有实际错误?你说得对,这种情况很少见,尽管确实会发生。编译器没有按照您期望的方式优化某些东西?我认为这种情况更常见(特别是因为编译器不允许执行一些“明显”的优化)。
标签: c# .net optimization compiler-optimization cil