基於GCC的編譯器的優化等級的執行原理

作者:良知猶存

轉載授權以及圍觀->歡迎添加WxId:Allen-Iverson-me-LYN

前情提示:在使用基於GCC做編譯器的IDE的時候,在很多時候我們會選擇不同的Optimize優化等級,不同的優化等級,在Debug中我們發現程序執行的邏輯和我們設定的代碼執行流程並不是很一致,甚至有時候差異巨大。所以我們來基於GCC介紹一下編譯器優化執行的邏輯。

取自於官網:https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

1.-O0:

  • 減少編譯時間,這個是默認選項,一般我們做調試用這個選項,對於代碼執行他不會做優化,代碼執行會按照我們設置的邏輯。

 

2.-O,-O1:

  •  把這兩個放置於一起,表明兩種優化效果差不多,都是優化代碼的大小以及代碼執行的速度,但是編譯時間會變得很大。

  • 優化的時候並開啓如下的優化標誌:

 

3. -O2

  • 下面可以看到開啓了例如finline-functions此類內聯函數的優化,所以程序執行的效率更快,對於程序執行邏輯有比較多的修改,你會發現調試的時候打了斷點執行,但是執行跳來跳去的。

 

4. -O3

  • 該選項除了執行-O2所有的優化選項之外,對於loop循環展開的優化開啓更多,提高了程序執行效率,但是會以損失優化代碼大小爲條件。

  • 這種一般都是採取很多向量化算法,提高代碼的並行執行程度,利用現代CPU中的流水線,Cache等。這個選項會提高執行代碼的大小,當然會降低目標代碼的執行時間。(摘自知乎)

5. -Os

  • 這個優化標識和-O3有些異同,同是,都是基於-O2進行的更升一級的優化,但是,-O3的目標是寧願增加目標代碼的大小,也要拼命的提高運行速度;-Os是儘量的降低目標代碼的大小,這對於存儲容量很小的設備來說非常重要。例如開啓的優化標誌中,有-fprefetch-loop-arrays -freorder-blocks-algorithm = stc等在內存中強制對齊數據,用來減少編譯的程序代碼的大小。

 

6. -Ofast:

  • 對-O3等級的更進一步的優化,fast名稱就可以察覺到,它忽略嚴格的數據標準,以至於可以開啓-ffast-math優化,使得程序更快。

 

知乎參考:https://www.zhihu.com/question/27090458

                                                                          ————————END————————

                                                                   如果大家覺得有用,可以關注我,有更多的文章。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章