C语言inline关键字

原创
2016/10/24 12:29
阅读数 6.2K

一、inline关键字的概念

inline关键字是C99标准的型关键字,其作用是将函数展开,吧函数的代码复制到每一个调用处。这样调用函数的过程就可以直接执行函数代码,而不发生跳转、压栈等一般性函数操作。可以节省时间,也会提高程序的执行速度。

二、inline关键字实例

在编写程序过程中,对于短小而且需要频繁调用的函数,可以将其声明为inline()函数。在调用该函数的过程中编译器会自动选择是否展开该函数。下面实例模拟了一个inline函数的展开。注意,这只是一个原理性的实现方式,具体的展开会因编译器的不同而不同:

#include <stdio.h>

//声明一个inline()函数add,执行两个数据的加法,返回两个数据的和
inline int f(int a, int b);

int main(void)
{
  int c;
  //调用inline函数,这部分内容在inline函数展开时会被add函数的代码所取代
  c = f(1, 2);
  printf("add : %d\n", c);
  return 0;
}

int f(int a, int b)
{
  return a + b;
}

inline函数的展开通常是在汇编阶段开始的。使用gcc编译器的“-S”选项可以观察源文件编译后的汇编代码。

三、inline关键字使用总结

使用inline关键字可以使程序的执行效率更高,同时是代码更紧凑。但是并不是所有的函数都可以将其声明为inline函数,因此使用inline函数还应注意一下几个问题:

  • 函数的展开是由编译器来决定的,这一点对程序员是透明的
  • 只有在代码很短的情况下,函数才会被展开。递归函数是不会被展开的。

inline函数在某种程度上来讲很像带参数的宏,例如对于上述两个数的求和操作,也可以定义为宏:

#define add(a, b, c)  c = a + b

虽然inline函数和带参数的宏很像,但是在使用方法上和宏还是有很大区别的:

inline函数和带参数的宏的区别
  inline()函数 带参数的宏
展开的时机 在编译的时候展开,因此inline关键字是一个编译关键字 在预处理时展开,因此#define关键字是一个预处理关键字
参数类型检查 inline()函数是一中函数,会进行严格的参数类型检查 不会检查参数类型,只是做简单的字符串替换,因此在使用带参数的宏时会有一些副作用,编写程序是要人为预防
是否允许有复杂语句 不允许出现复杂语句,如果出现复杂语句,该函数将不会展开,例如递归,大型循环等 对此不做要求。宏只是做字符串替换操作,而不了解语句的含义
是否一定被展开 不一定,是否展开由编译器决定 一定,只要使用了宏就可以保证被展开

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部