2

有沒有辦法在編譯期間或編譯之後獲取有關代碼的哪些部分已被優化的信息,但無需查看程序集或執行代碼。如何知道哪些代碼已被優化?

如果能夠立即知道一個大代碼塊是否得到了優化,那就太好了。

+0

爲什麼這會很高興知道?這是優化器的* job *,用於優化大塊代碼。它消除了複雜的抽象,輔助方法和人類編寫的各種事物,使代碼更易於閱讀和推理。爲什麼你覺得你需要再次猜測優化器?你有真正的問題嗎? –

+0

@Cody Gray它可以暴露我正在編譯的代碼中的錯誤(甚至在編譯器中),它會滿足我的好奇心:) – user2373145

回答

1
gcc -S 

將輸出將被傳遞給彙編器(並最終被鏈接到可執行文件中)的彙編代碼。如果你斜視正確的方式(並且耐心),你可以從中反向工作以確認給定的代碼位是否已經被包含在可執行文件中,或者被優化掉了。

顯然不是東西,你會做,除非你有懷疑的東西是怎麼回事,考慮到時間和所需的工作量......

+0

我知道關於-S,但我希望有一個更直接的解決方案。 – user2373145

1

抱歉,您的期望不匹配究竟編譯器一樣。無論您是在尋找死代碼還是發現導致應該跳過的代碼的錯誤,編譯器都不能提供易於閱讀的信息。

利用編譯器將源代碼的每行轉換爲機器指令序列,編譯器可以輕鬆地告訴您它沒有包含與特定行對應的任何內容。當然,它不能告訴你一行代碼是否被轉換爲機器指令,但這些機器指令事實上不會被執行 - 代碼可訪問性是undecidable - 但我不認爲這就是你想要的。

問題是現代優化編譯器比這個複雜得多。一段代碼通常會在不同的假設下進行復制和編譯(專業化,部分評估,循環展開......)。或者,相反,代碼片段可以合併在一起(函數內聯,...)。源代碼和機器代碼之間沒有簡單的對應關係。 (這就是爲什麼調試器有時無法報告二進制指令的確切源代碼位置的原因。)

如果一大塊代碼被優化掉,那可能僅僅是因爲它是許多專用副本之一,並且特定的專業化從不發生(例如,有x==0x!=0的單獨代碼,並且y==0y!=0xy的單獨代碼從不爲0,因此x==0 && y==0分支最終被丟棄)。它可能是由編譯時條件指令(例如編譯器優化的C宏)生成的;這經常發生在C代碼中,如果編譯器報告了所有這些實例,那將會產生大量誤報。

獲取有用的可能未使用的代碼或可能指示錯誤的程序代碼的報告需要靜態分析的類型與編譯器所做的不同。有些工具可以做到這一點,但它們通常不是將源代碼轉換爲優化機器代碼的相同工具。製作靜態分析工具既能發現潛在的問題,又能發現有用的東西,並且不會產生如此多的誤報以致於幾乎不可用,這並不容易。

相關問題