天天看點

inline關鍵字

首先說一下使用inline關鍵字的好處:

1、預處理(define)隻是單純的代碼替換,使用inline可以解決define宏隻是替換代碼産生的問題,因為它像函數一樣運作。

2、inline不需要承擔函數調用的開銷。本質上它也是代碼展開。

inline關鍵字的壞處:

1、代碼膨脹

inline void test()

{

 std::cout<<"test"<<std::endl;

}

test();//将産生如下彙編代碼

004012B1  mov         eax,dword ptr [__imp_std::endl (403084h)]

004012B6  push        eax 

004012B7  push        ecx 

004012B8  mov         ecx,dword ptr [__imp_std::cout (403080h)]

004012BE  push        offset string "test" (40318Ch)

004012C3  push        ecx 

004012C4  call        std::operator<<<std::char_traits<char> > (401C30h)

004012C9  add         esp,0Ch

004012CC  mov         ecx,eax

004012CE  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (40303Ch)]

unsigned int i = splitA(p, ",", ve_str1, false);//一個非内聯函數的彙編代碼

004012F0  lea         ecx,[esp+10h]

004012F4  mov         byte ptr [esp+90h],4

004012FC  call        splitA (401120h)

可以看出,inline是通過空間來換時間的典型舉措。

2、内聯函數修改時,需要重新編譯

這點很容易了解,内聯函數隻能在頭檔案中聲明與定義。工程到一定規模的時候會浪費很多的時間在編譯連接配接上。

3、無法調試内聯函數

假如一個定義為内聯的函數裡面的斷點生效了,那麼它被編譯器忽略了内聯選項,一個非内聯的内聯函數。

使用内聯函數的時候需要注意的:

1、要知道編譯器為你生成的代碼,比如一個看上去為空的構造函數其實包含了很多成員的構造過程,如果這部分展開的代碼太長,編譯器會忽略inline建議。大部分構造析構函數不建議為内聯(在類的聲明中定義即建議内聯),因為他們太長了。

2、如果函數中包含靜态變量,那麼不建議聲明為内聯。

3、内聯函數不能定義為虛拟的

virtual函數的調用是在運作期決定的,而内聯函數是在編譯期在被調用處進行代碼替換。

4、一個内聯函數是否真正内聯是由編譯器決定的

可以在函數中打斷點,或者檢視彙編來知道此函數是否被内聯。

是以,謹慎地在确實能提高程式效率的%20部分正确地使用内聯。

注:此篇為effective c++ 學習筆記,具體請看effective c++ item 33