3 回答

TA貢獻1845條經驗 獲得超8個贊
Stricto sensu,GCC編譯器的中端由優化遍歷的序列(實際上是嵌套樹,在編譯過程中會動態更改)組成,因此,如果GCC沒有進行優化,則將無法發出任何代碼。
想想另一種方式:輸入語言GCC是相當豐富的(即使是純C,在那里你有while,for,...),但中間GIMPLE語言是更差(特別是GIMPLE / SSA),所以你需要到應用一些轉換以將源AST轉換為Gimple。這些轉換是優化過程,幾乎可以定義為。
另請參閱該答案和該答案的圖片(SVG圖片),并閱讀此處提到的參考資料。
您應該理解-O0為禁用生成某些可執行文件不需要的任何其他優化(例如,-O1etc等提供的優化)。

TA貢獻1809條經驗 獲得超8個贊
為了回答我的問題,我做出了一些結論和假設:
因此,我想說用O0進行編譯并不意味著不會應用任何優化。如上面@abligh所述,可以減少編譯時間并改善調試效果的選項將打開。
換句話說,O0在編譯級別上正在優化。生成的二進制文件未經過優化,以簡化調試過程。
我舉一個例子:該選項在O0級別啟用
漸進式循環優化
在GCC文檔中:
此選項告訴循環優化器使用語言約束來得出循環迭代次數的界限。這假定循環代碼不會通過例如引起有符號整數溢出或超出范圍的數組訪問來調用未定義的行為。循環迭代次數的界限用于指導循環展開和剝離以及循環退出測試優化。默認情況下啟用此選項。
因此,對于GCC 4.8.x,默認情況下將啟用近50個選項。
添加回答
舉報