4. inline 内联函数
函数是 C 语言中重要的编写功能的单位。
在函数调用的过程中,函数的实际调用参数会赋值给函数的形式参数,函数的返回地址也会压栈到栈内存中,函数的返回值也会传递会调用处。这无疑是一笔运行时开销。尤其是函数调用以值传递的方式传递结构体或联合体时,这个开销就会更大,尤其是这个函数的调用频率特别高,比如每秒成百上千次时,这个开销可能难以承受。这时为了减小函数的调用开销。我们通常将函数内部的代码直接写到调用该函数的地方,这样就避免了调用的传参开销。
C 语言的 C99 标准引入了内联函数的概念,它是将一个比较短小的函数,在调用阶段,将函数体部分插入到调用的地方,来避免函数调用的开销。
内联函数是指有可能被优化掉,被放入到调用表达式处的函数。
C 99 的标准中可以使用 inline 关键字来声明内联函数。
inline 关键字 用于函数标识符的声明,它是建议编译器,使用 inline 关键字声明的函数尽可能使用内联编译。
语法
inline 返回类型 函数名(形式参数变量列表){ 函数体内的语句 };
说明:
- inline 关键字需要写在函数定义处。
- 内联函数要尽可能的短小,否则编译器可能会放弃内联编译。
示例
比如有如下内联函数 myadd。
#include <stdio.h>
// 声明 myadd 函数是内联函数
inline int myadd(int x, int y) {
return x + y;
}
int main(int argc, char * argv[]) {
int result;
result = myadd(100, 200);
printf("result: %d\n", result);
return 0;
}
其编译后的结果可能是如下程序。
#include <stdio.h>
int main(int argc, char * argv[]) {
int result;
result = 100 + 200;
printf("result: %d\n", result);
return 0;
}
再次经过编译器优化后可能是如下程序。
#include <stdio.h>
int main(int argc, char * argv[]) {
printf("result: %d\n", 300);
return 0;
}
内联函数的优缺点
优点
- 减少函数调用的开销,对小函数调用尤为有效。
缺点
- 如果多次调用可能会引起代码膨胀,比如一个内联函数内有 10 行代码,你在程序中有 100 次调用,那这 10 行代码会复制一百次到调用的地方,引起编译后的可执行程序变大,运行时代码段也会变大。
实验:
尝试完成上述示例的代码编写,看你的编译器是否支持 inline 关键字。