auto_inline,inline以及編譯器優化之間的關係

      對函數進行inline處理時程序優化的一種方法,由於可以減少調用函數的開銷,這種方法適用於大量頻繁調用的小函數,由於會將函數的內容複製到每一處調用的地方,會增加編譯二進制文件的體積。

      inline處理的具體流程是,在編譯的時候,對於一個可以inline的函數,在每一個調用這個函數的地方,直接以這個函數的內容替代,因此默認不會生成這個函數的函數體。

下面是我的一點總結:

1. 首先要明白一點的就是只有在編譯器開啓優化選項的時候,纔會有inline行爲的存在,比如對g++在-O0時就不會作任何的inline處理;

2. 不管是#pragma auto_inline(on/off)還是inline指令,都僅僅是對編譯器提出inline的建議,最終是否進行inline由編譯器自己決定;任何編譯器都可以在優化程序時對程序進行inline處理,對於-O2的優化方式,編譯器會通過啓發式算法決定是否值得對一個函數進行inline,同時要保證不會對生成文件的大小產生較大影響。 而-O3模式則不在考慮生成文件的大小。

3. 當使用#pragma auto_inline(off)指令時,會關閉對函數的inline處理,這時即使在函數前面加了inline指令,也不會對函數進行inline處理。

4. 將類的成員函數的定義直接寫在類的聲明中時,視爲隱式的inline請求,編譯器會自動進行inline處理。而對於類的成員函數聲明在.h文件中,定義在.c或.cpp文件中時,不會進行inline處理。這是由於在inline處理在編譯時進行,而對於調用改成員函數的.cpp文件只會include那個類的頭文件,在編譯時是找不到那個成員函數的定義的。 我看到網上有人說可以,但是我試了一下是不行的,加inline指令會報undefined reference錯誤。

暫時寫到這裏,有時間再補充。

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