乐趣区

构造析构函数发生异常 与 inline

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 :)

退出移动版