2011-11-15 55 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')。 –