首先說一下使用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