2012-02-17 41 views
2

編譯器會刪除這個if語句嗎?編譯器是否會刪除總是評估爲零的塊?

#define DEBUG 0 
int main(int argc, char ** argv) 
{ 
    if(DEBUG) 
    { 
     ... 
    } 
    return 0; 
} 

我試圖谷歌這一點,並搜索計算器,但我想我的搜索詞是壞的,因爲我無法找到所需的信息。

如果對此進行了優化,我想了解哪些內容以瞭解優化?

Constantin

+10

您可以通過要求編譯器生成其輸出的彙編列表來始終找出自己。 – 2012-02-17 22:26:26

+1

取決於你的編譯器及其選項,但是它可能會刪除整個塊。如果它真的添加和刪除你需要的代碼,儘管我使用#ifdef而不是if來使用條件編譯。 – Dampsquid 2012-02-17 22:28:58

+0

只要標準允許編譯器執行x或y,就會發現一個編譯器執行x,另一個執行y。所以問這樣的問題總是隻回答:「試試看,看看」 – PlasmaHH 2012-02-17 22:33:03

回答

3

我不確定編譯器是否可以優化它。我猜是的,因爲在這種情況下你不會有任何副作用,所以它可以在不改變代碼語義的情況下被安全地刪除。

在任何情況下,猜測都不好,依靠優化也不好。

爲什麼不使用#ifdef .. #endif塊代替代碼塊?

#define DEBUG 

#ifdef DEBUG 
    ... 
#endif 

以這種方式,你將有一個肯定的結果。

+0

我也在考慮這種方法,我只是不想用#ifdef膨脹我的源文件。 (供人閱讀)。謝謝傑克。 – Constantin 2012-02-17 22:35:16

+1

我只是通常會將它們與代碼一起縮進,以避免有一個不好的視覺方法..但這只是個人品味的問題 – Jack 2012-02-17 22:36:55

3

你不需要猜測。編譯並與調試器一起觀察彙編指令。您甚至不需要熟悉程序集以查看是否爲有問題的行生成了實際的代碼。

3

是的,任何像樣的C/C++編譯器都會刪除這樣的block。

2

您無法做出通用的說法,即每個編譯器都會以相同的方式優化相同的內容。同樣,今天可能發生的任何編譯器在未來的版本中都可能不會。

是的,今天一些編譯器可以並且會這樣做,但這並不意味着您應該爲此計劃或期望它。如果你不想要那些代碼,請將其註釋掉,如果將其刪除或刪除。

正如別人所說,嘗試一下,找出自己。如果你正在調試某些東西並懷疑這種情況已發生或沒有發生,只需查看並找出...

+1

在這種情況下,我認爲假設沒有工業強度的編譯器永遠不會失敗,優化這一點。但另一方面,DEBUG就是某些人可能會不小心做出一個變量的東西,可以在命令行上進行配置。從這個意義上講,這可能會很麻煩。 – jkerian 2012-02-17 22:52:00

+0

正確的是,我正在談論更普遍的「將編譯器刪除」部分問題太過開放和模糊。調試這個詞也會導致使用ide的人不知道使用了哪些命令行選項(包括優化),並且在編譯調試時會跳過一些,如果不是所有優化都會跳過,那麼您可以單步執行內存監視並像這樣的東西。 – 2012-02-17 22:57:52

+0

@dwelch,謝謝你的洞察力。你能否進一步解釋你的第二條評論?正在做一個#define DEBUG壞習慣?謝謝。 – Constantin 2012-02-17 23:55:04

1

你有很好的答案來檢查它在你的編譯程序集輸出中。我想有時會有着相似的成語,這是非常有用的對我說:

int main(int argc, char ** argv) 
{ 
    const bool bDebug = false; 
    if(bDebug) 
    { 
     ... 
     LOG(""); /// some heavy loging here 
    } 
    return 0; 
} 

,所以我在我的代碼中的一些相關的地方留下這樣如果-S,當我得到一個錯誤報告的東西壞happend我一步通過代碼,當我需要輸出一些大的數組/數據結構時,我從調試器bDebug變量(實際上我將它們命名爲bVerbose)進行修改,然後允許代碼輸入這樣的IF-s。您不必重新編譯代碼來添加大量日誌記錄。