内联函数
一般情况下,函数在调用过程中需要进行一些准备工作,比如参数入栈,局部量保存,代码跳转等。调用返回时需要恢复现场。函数值返回,执行流程返回的调用前的下一条语句,这些都需要消耗一定的时间和空间。在一些时间效率要求高加上调用频率频繁的情形下,可以使用内联函数的方式来提高执行效率。
内联函数指定编译器处理函数调用的方式。从代码角度上看,内联函数有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时类似宏替换,内联函数使用函数体替换调用处的函数名。一般情况下,用inline
放在函数名前表示内联函数。
/*内联函数使用*/
#include <iostream>
using namespace std;
inline int abs(int);//声明内联函数
int main(void)
{
int i = -10,m;
m = abs(i);
cout<<"absolute value ="<<m<<endl;
return 0;
}
inline int abs(int a)//定义abs为内联函数
{
if(a>0){
return a;
}else{
return -a;
}
}
由于在定义函数时指定它为内置函数,因此编译系统在遇到函数调用"abs(i)“时,就用abs()函数体的代码替换掉"abs(i)”,同时将实参代替形参。原来函数第7行"m = abs(i)"被等价置换成 m = a>0?a:-a;
注意:
(1) 递归函数不能定义为内联函数
(2) 内联函数一般适合于不存在while和switch等复杂的结构函数上,否则编译系统将该函数视为普通函数处理。
(3) 内联函数只能先定义,后使用,否则编译系统也会把它认为普通函数。
(4) 对内联函数不能进行异常的接口声明。
(5)编译器不保证inline修饰的函数一定会作为内联函数处理,一般结构简单,语句少的函数定义成内联函数才会得到编译器的认可。同时,没有用inline修饰的,结构简单的函数也可能被编译成内联函数。