为什么使用inline函数
inline函数看起来非常美好。可以使用它们又不用承担调用函数的开销,相比类似功能的宏,inline函数更安全不易出错。inline函数的思想是:对inline函数的每一次调用都用函数本体代替。这样做好处是不需要函数调用开销,坏处是很可能产生代码膨胀。因此:一般对于那些代码简单而又频繁调用的函数通常被声明为inline函数。
隐式inline和显式inline
隐式inline就是将函数定义在类的定义中。
class person
{
public:
int age() { return age; } //age函数被定义于类定义中,因此是一个隐式inline
private:
int age;
}
显式inline就是在函数前加上inline关键字。
template<class T>
inline const T& max(const T& a, const T& b) //明确申请inline
{
return (a < b) ? b : a;
}
inline函数必须定义在头文件
inline必须定义于头文件,是因为大部分的构建环境在编译期进行inlining,因此,在源文件调用inline函数的地方,需要知道函数具体长什么样,这样才能进行文本替换。类似的还有template函数,因为编译器在调用template函数的地方需要根据传入的实参实现实例化,因此需要知道template函数长什么样,因此需要在头文件定义它。
inline只是个申请而非强制命令
inline对编译器是一个申请而不是一个强制命令。
如果函数太复杂,编译器很可能拒绝将其inlining。还有一种情况情况是对于虚函数使用inline也会无效,逻辑很清晰:inline是一种编译期进行代码文本替换的行为,而虚函数需要在运行期才能确定调用那个函数。