4. inline 内联函数

函数是 C 语言中重要的编写功能的单位。

在函数调用的过程中,函数的实际调用参数会赋值给函数的形式参数,函数的返回地址也会压栈到栈内存中,函数的返回值也会传递会调用处。这无疑是一笔运行时开销。尤其是函数调用以值传递的方式传递结构体或联合体时,这个开销就会更大,尤其是这个函数的调用频率特别高,比如每秒成百上千次时,这个开销可能难以承受。这时为了减小函数的调用开销。我们通常将函数内部的代码直接写到调用该函数的地方,这样就避免了调用的传参开销。

C 语言的 C99 标准引入了内联函数的概念,它是将一个比较短小的函数,在调用阶段,将函数体部分插入到调用的地方,来避免函数调用的开销。

内联函数是指有可能被优化掉,被放入到调用表达式处的函数。

C 99 的标准中可以使用 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;
}

内联函数的优缺点

优点

缺点

实验:

尝试完成上述示例的代码编写,看你的编译器是否支持 inline 关键字。