内联函数
函数的调用有利于代码重用,提高效率,但有时频繁的调用函数会增加时间与空间的开销反而造成效率低下。因为调用函数是将程序执行顺序从函数调用处跳转到函数所在内存中的入口地址,将调用现场保留,跳转到函数入口地址执行函数,函数调用结束后再回到调用现场,所以频繁的函数调用会增加程序开销。
为了解决这个问题,C语言提供了内联(inline)函数,在编译时将函数体嵌入到函数调用处。内联函数其实只是在函数定义前面加上inline关键字,其格式如下:
inline 返回值类型 函数名(参数列表)
{
函数体;
}
上述格式中,inline是定义内联函数的关键字,这样就将函数定义成了内联函数,当调用内联函数时,编译器就会把该函数体代码插入到调用位置,省去了函数调用的开销。内联函数只是在定义时加上inline关键字,在调用时与普通函数相同。接下来通过一个案例演示内联函数的调用,具体如例1所示。
例1 inline.c
1 #include <stdio.h>
2 inline void func() //内联函数
3 {
4 printf("这是一个内联函数\n");
5 //其他功能代码
6 }
7 int main()
8 {
9 func(); //调用内联函数func()
10 return 0;
11 }
例1运行结果如图1所示。
图1 例1运行结果
在编译时,编译器看到func()函数是一个内联函数,就会将func()函数代码插入到func()函数的调用处,编译后的代码如下所示:
int main()
{
printf("这是一个内联函数\n");
return 0;
}
内联函数虽然节省了开销,但是过多的内联函数又会造成代码膨胀,因此一般都将结构简单、语句少的函数定义为内联函数,内联函数中不可以包含复杂的控制语句。递归函数不可以定义成内联函数。
需要注意的是,inline只是建议编译器将函数嵌入到调用处,但在实际编译过程中,编译器会根据函数的长度、复杂度等自行决定是否把函数作为内联函数来调用。