gcc悄無聲色將靜態函數內聯了
阿新 • • 發佈:2017-06-06
關鍵字 編譯器 隔離 項目 影響
說到內聯,可能你還停在十幾年前甚至二十多年前的C++教典,c++有內聯關鍵字inline,甚至還用來與c做區分。c99開始c引入inline,gcc比c99早實現對inline支持,vc中c沒有關鍵字inline,inline只能用於c++,但有另一關鍵字__inline,但若你要用vc編譯gcc下c代碼,遇到cl抱怨不識別inline,只要將inline在預編譯宏中定義為__inline也就可以了。
gcc編譯器屬性中還有一個noinline,有了inline為什麽還要來一個noinline。沒有用inline不就等於noinline了嗎。還有always_inline屬性。因為在實際中,定義為inline也不一定統統都會被內聯,內不內聯最後是由gcc編譯器決定,只是你的聲明會影響它的決定。同樣你沒有定義為inline,函數就不一定都隔離內聯,編譯器在優化中通常會為你決定內聯了一些函數,不論這個函數體積是大是小。noinline和always_inline屬性就是字面意義那樣了。
正好近日調試ffmpeg代碼,碰上一例子,用來作例證:
ffmpeg是個c代碼項目。
avformat_write_header是一個只有十行的函數,就是調用其它函數。
init_muxer是個體積比較大的靜態函數,沒有定義為內聯,卻內聯到了一個體積很小的函數(avformat_write_header)內。
gcc悄無聲色將靜態函數內聯了