1.inline 函數就是 : 申請對此函數的每一個調用都用 函數本體替換;c++
一個函數可否使用inline主要取決編譯器; 總的來慎用inline,好比debug時又若是對一個不存在的函數設置斷點, 好比會額外的增長目標代碼,好比若是是一個庫程序,則須要所有從新編譯; 除非相似std::max,std::min 之類的函數 對於函數指針有例外狀況 好比:
inline void func(){} void (*pf)() = func; //調用 func() ; //是一個inline調用 pf() ; //仍是函數調用
2.構造析構函數異常與inline函數
*c++保證若是在構造期間有異常,則已經構造好的也會被銷燬 結論:構造析構函數不要使用inline 好比:
class Base{ private: std::string s1,s2; }; class Derived : public Base{ public: Derived(){} //空構造 private: std::string s3,s4; };
以上Derived的構造函數在編譯後大概是這樣的:debug
Derived::Derived(){ Base::Base(); //Base的構造函數也相似下面的代碼,構造了s1,s2; try{ s3(); //構造Derived::s3 } catch(...){ Base::~Base(); throw; } try{ s4(); //構造Derived::s4 } catch(...){ Base::~Base(); throw; } }
經過上述代碼能夠發現,若是Base構造是inline, Derived也是inline的話,
Base的構造函數代碼將被插入Derived構造中,意味着Derived中執行4個string構造;
而在調用Derived的地方也將所有替換這些代碼, 隨着調用的次數越多目標代碼將越龐大;指針
最終結論: 是否使用inline ,取決於此函數是否簡單到像max/min;最後慎用inline :)code