2014-01-22 29 views
1

現代編譯器(GCC)是否足夠聰明以優化這個無操作函數? 我知道他們可以優化無操作,但我想知道他們如何確定函數調用實際上是否是空操作。現代編譯器會優化「if false」路徑嗎?

void someFunction(){ 
    if false{ 
     doFunction() 
    } 
} 
+0

要真正看到行爲,您可以在gdb中運行代碼並逐步執行該函數。在開始進入代碼之前,在gdb中按Ctrl + x然後選擇2來查看您的代碼和相應的程序集。當你跳過已經優化過的代碼時,gdb將打印一個優化的消息值。 – abhi

+1

http://en.wikipedia.org/wiki/Dead_code_elimination –

回答

3

嗯,首先,它不會因爲你錯過了周圍的條件括號:-)

但是,編譯,在所有與固定的,我想你會發現if聲明本身(和它的身體)可以被優化爲不存在。 someFunction()函數幾乎肯定會保留下來,因爲你可以從某個地方調用它,而某個地方可能來自完全不同的翻譯單元(源文件)。

如果它是靜態並且編譯器可以推斷出該函數未被使用,那麼將可能刪除整個函數。這是有效的,因爲它是靜態的,不會從其他地方調用。

但是,你必須小心。調用函數並不是使用它們的唯一方法,還有其他的可能性,例如將它們的地址和使用那樣的,比如帶回調。

+0

我只是寫了一些快速僞代碼,不應該是一個真正的函數 – Igglyboo

0

現代編譯器執行靜態分析並刪除無法訪問的代碼。