構造析構函數發生異常 與 inline

  • inline
  • 構造析構函數發生異常

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

相關文章
相關標籤/搜索