2011-11-15 56 views
2

我没有编译器的太多的知识和.Net如何优化生成的机器代码,但想了解以下情况:编译器优化的if/else

class AnyClass 
    { 
     public bool anyFlag; 
     AnyClass() 
     { 
      anyFlag = true; 
     } 

     public void Action()   
     { 
      if(anyFlag) 
       //Perform Certain Actions 
     } 
    } 

anyFlag不会改变整个该计划的范围。编译器会为Action方法生成MIL /机器代码吗?如果是的话,那么它会在那里检查吗?

+0

我想你的意思是私人bool anyFlag; –

+0

为什么单一的事情对你来说太重要了? – svick

+0

我从理解的角度提出了更多的问题。我认为它毕竟是重要的:) – Aziz

回答

7

在你的情况下,编译器不会过滤if语句,因为你的anyFlag是public的(所以它可以从多个位置改变),并且因为值只在consctructor中设置,所以编译器现在不会值直到运行时。

下面的代码你想要做什么:

static void MyFunc() 
{ 
    const bool flag = true; 

    string s = null; 
    if (flag) 
    { 
     s = "a"; 
    } 
    else 
    { 
     s = "b"; 
    } 
} 

如果你将在Visual Studio中的代码,你会看到一个生成的警告,指出S =“B”;永远不会被达到,这个代码将被优化。

1

是的,编译器会生成IL。由于您可以稍后用户反射或发送以调用该方法或更改anyFlag的值,因此它会保留该值。您可以使用Visual Studio附带的ildasm反汇编生成的可执行文件来显示。

+3

但是,当谈到性能时,JIT生成的本机代码的性能并不重要。 – svick

+0

当然,但是因为JITer的优化是一个黑盒子,没有关于这个问题的规范。你只需要相信它正在完成它的工作。更重要的是,IL被生成,并且开发人员可以在需要时访问代码。 – Polynomial

+0

@Polynomial'你可以通过使用ildasm'分解生成的可执行文件来显示它,只需自己尝试上面的代码(用'const bool')。 –