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

請問是否有關(guān)于類似編譯器或者堆棧的文檔,或者編譯器自動壓棧個數(shù)所依據(jù)的規(guī)則是什么樣的?
SIMD計(jì)算機(jī)的優(yōu)化編譯器設(shè)計(jì)
Keil C編譯器編程規(guī)則和代碼優(yōu)化

編譯器_keil的優(yōu)化選項(xiàng)問題
C編譯器及其優(yōu)化
編譯器如何對代碼進(jìn)行優(yōu)化(上)
編譯器如何對代碼進(jìn)行優(yōu)化(下)

編譯器的優(yōu)化選項(xiàng)

評論