c语言inline关键字_weixin_34198583的博客-爱代码爱编程
一、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关键字是一个编译关键字 | 在预处理时展开,因此#define关键字是一个预处理关键字 |
参数类型检查 | inline()函数是一中函数,会进行严格的参数类型检查 | 不会检查参数类型,只是做简单的字符串替换,因此在使用带参数的宏时会有一些副作用,编写程序是要人为预防 |
是否允许有复杂语句 | 不允许出现复杂语句,如果出现复杂语句,该函数将不会展开,例如递归,大型循环等 | 对此不做要求。宏只是做字符串替换操作,而不了解语句的含义 |
是否一定被展开 | 不一定,是否展开由编译器决定 | 一定,只要使用了宏就可以保证被展开 |
转载于:https://my.oschina.net/daowuming/blog/774699