現在的編譯器有多智能,可能你辛辛苦苦寫的代碼,在編譯器看來就是幾句廢話,直接被刪除掉。
以 gcc 編譯器為例,編譯的時候可以加上 -O 選項來優化代碼,優化等級從 0 到 3。
寫一些簡單的代碼給大家演示下。
#includevoid delay() { for (int i = 0; i < 40000; i++) for (int j = 0; j < 10000; j++); } int main() { printf("helloworld "); delay(); printf("helloworld "); return 0; }
比如在兩條輸出語句之間加上延時,正常的現象是這樣的,很明顯,延時函數起了作用。
如果編譯的時候加上 O1 優化選項,在編譯器看來,delay 函數什么事都沒干,可以直接刪掉。
比較兩者的匯編代碼,就能看出開啟 O1 優化后,主函數中沒有調用 delay,運行的現象也確實沒有延時。
再比如這樣的代碼,test 函數直接返回了 1234。
如果不開啟優化,主函數會調用 test 函數,如果開啟了優化,編譯器會跳過調用 test 函數,直接取他的返回值來使用。
再來看下 O2 優化級別,比如這個代碼:
#includevoid test() { printf("helloworld "); } int main() { for (int i = 0; i < 3; i++) { test(); } return 0; }
循環調用 test 函數,test 函數也只是簡單的使用 printf 輸出字符串。
三份匯編代碼分別對應三個不同的優化級別,沒開優化,O1 優化,O2 優化。
沒開優化的時候,匯編代碼就是對應 C 代碼,有循環,循環中調用 test 函數。
開啟 O1 優化,循環沒了,直接調用三次 test 函數,因為循環確實浪費時間。
開啟 O2 優化,這次直接把 test 函數跳過,主函數中直接調用 puts 函數,這里的 puts ,就是 printf 優化而來,前面講過,使用 printf 直接輸出字符串,編譯器會默認優化成 puts。
最后還有一個級別是 O3,O3 在 O2 的基礎上優化更深。不過關于 O3 的優化并沒有找到簡短的代碼,這里就不給大家做演示。
在平時的學習中并不建議使用編譯器的優化策略,尤其是更高級別的優化,為了提升代碼的運行效率,很多時候編譯器會調整代碼結構,導致運行的結果跟我們預期不一樣。作為初學者,知道有這么回事就行。
-
函數
+關注
關注
3文章
4344瀏覽量
62812 -
代碼
+關注
關注
30文章
4809瀏覽量
68826 -
編譯器
+關注
關注
1文章
1640瀏覽量
49198
原文標題:什么樣的代碼會被編譯器優化
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論