C++中內聯函數何時被編譯器禁止?

C++當中定義內聯函數,可以讓編譯器將對內聯函數的調用直接展開。


這就多少有點像宏定義了,而且沒有宏定義的缺點(預處理替換,無法當成變量鏈接到符號表、調用有可能導致參數異常被改、等等)。


使用內聯函數可以避免函數調用的開銷(棧開闢、返回地址設定、棧展開),在一定的程度上可以提高程序的性能。但是這種提高是有代價的。

編譯器將函數展開,會直接導致可執行程序變大。(導致運行缺頁、cache命中率降低 effective c++ page 135)


編譯器在某些情況下會禁止inline:


1:編譯器禁止虛函數inline


      inline展開是在編譯時進行的(宏定義是在預處理時展開的),而虛函數是在運行時決定調用哪個函數的。因此編譯器對虛函數的inline無能爲力

     (g++下試驗過,編譯器連警告都沒有一個)


2:帶有循環或者遞歸的調用

    

      如何inline函數過於複雜,複雜到函數本身執行的成本,比函數調用(棧開銷)成本還要高,編譯器禁止inline


3: 通過函數指針調用inline函數


      雖然編譯器會展開inline函數,但是還是會爲內聯函數生成函數本體。通過函數指針,使得其等於內聯函數,通過函數指針調用,無法 inline


     inline void f() {...}

    void (*p)()=f;

     p();   //此處無法內聯

    

   

發佈了18 篇原創文章 · 獲贊 25 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章