内联函数:
在函数定义时使用inline关键字,在函数声明中使用inline是没有效果的。函数的使用者不需要知道函数是否是内联函数,这也是inline关键字不应该出现在函数声明中的原因。
如果在函数声明的同时给出函数的定义,编译器会自动将函数识别为内联函数,但是不应该这样编写代码。
内联函数是怎么工作的呢,在编译阶段,编译器在发现inline关键字时会将函数体保存在函数名所在的符号表内,在程序中调用内联函数的地方,编译器直接在符号表中获取函数名和函数体,并用内联函数的函数体替换掉函数调用,从而节省了运行时调用函数的开销。
在使用内联函数时,要注意内联函数产生的代码膨胀问题。如果一个内联函数的函数体非常庞大,并且在程序各处都会调用这个内联函数,那么代码展开后的内联函数就会内嵌到程冠各处,从而造成程序代码体积极速增长,也就是代码膨胀。因此,在定义一个内联函数时,要确保函数体十分简单。现在的编译器大多数都经过优化,能够判断一个函数是否适合作为内联函数。
内联函数与宏定义的区别:
根本区别:宏定义仅仅是字符串替换,而内联函数是个函数,可以像普通函数一样调试。
内联函数和宏定义的代码展开发生在不同阶段,宏定义的展开是在预处理阶段,而内联函数的展开是在编译阶段,因此许多编译阶段的工作只对内联函数有效,如类型安全检查和自动类型替换。
内联函数作为类的成员函数时,可以访问类的所有成员,this指针也会隐式的正确使用。