- inline
- 构造析构函数发生异常
1.inline 函数就是 : 申请对此函数的每个调用都用 函数本体替换;
一个函数能否使用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的构造函数在编译后大概是这样的:
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 :)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。