C语言-inline关键字-爱代码爱编程
By: Ailson Jack
Date: 2021.03.14
个人博客:http://www.only2fire.com/
本文在我博客的地址是:http://www.only2fire.com/archives/131.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。
1.基本概念
C语言中的inline关键字是C99标准的关键字,它的作用是将函数展开,把函数的代码复制到每一个调用该函数的地方。这样调用该函数的地方就可以直接执行函数代码,而不发生跳转、压栈等一般性函数操作。可以节省时间,也会提高程序的执行速度。
使用inline关键字修饰的函数就是内联函数。
在C语言中,如果一些函数被频繁的调用,尤其是这些函数在递归函数中被调用,那么如果递归过程很长,就有可能出现递归还没完成,但是栈空间被用完了。此时如果将这些函数定义为内联函数,那么在递归函数中,内联函数是不会发生函数跳转和压栈操作的,因此也就不存在栈溢出的情况了。
2.内联函数的定义方法
将一个函数定义为内联函数是比较简单的,直接在定义函数的时候,在函数的前面添加inline关键字即可。
内联函数(inline函数)一般和static一起使用,如果内联函数定义在.c文件中定义并且和static关键字一起使用,那么这个内联函数的作用域就是当前的.c文件,其他.c文件不能使用该内联函数;如果内联函数在.h文件中定义并且和static关键字一起使用,那么这个内联函数能够被包含该.h文件的所有源文件或者头文件使用。
内联函数的定义方法如下:
static inline add(int a, int b)
{
return (a + b);
}
3.内联函数使用场景
如果函数本身比较简洁,并且函数使用的频率比较高,那么就可以将函数定义为内联函数。当然了,如果函数本身比较简洁,但是使用的频率不高,也可以将函数定义为内联函数。
在嵌入式开发中,内联函数还是比较重要的,将一些功能简洁的函数定义为内联函数,可以减少代码的跳转和栈空间的使用,RAM在嵌入式系统中还是比较宝贵的。
使用内联函数可以使程序的执行效率更高,同时是代码更紧凑。当然了使用内联函数的缺点也比较明显,就是程序的大小会变大(程序占用flash的空间变大,占用的RAM不变),因为每一个调用内联函数的地方,都会有一个内联函数的拷贝。
4.内联函数和宏定义的一些对比
内联函数在某种程度上和宏定义很想,比如上述的内联函数可以使用宏定义来描述:
#define add(a, b) ((a) + (b))
虽然内联函数和宏很像,但是在使用方法上和宏还是有很大区别的,下面就从几个方面来对内联函数和宏进行对比:
(1).展开的时机:
内联函数在编译的时候展开,因此inline关键字是一个编译关键字。
宏是在预处理时展开,因此#define关键字是一个预处理关键字。
(2).参数类型检查:
内联函数会进行严格的参数类型检查。
宏不会检查参数类型,只是做简单的字符串替换,因此在使用带参数的宏时会有一些副作用,编写程序时要人为预防。
(3).是否允许有复杂语句
内联函数不允许出现复杂语句,如果出现复杂语句,该函数将不会展开,例如递归,大型循环等。
宏定义对此不做要求。宏只是做字符串替换操作,而不了解语句的含义。
(4).是否一定被展开
内联函数不一定会被展开,是否展开是由编译器决定的。
宏一定会被展开,只要使用了宏就可以保证被展开。
如果文中有什么问题欢迎指正,毕竟博主的水平有限。
如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^。
排版更好的内容见我博客的地址:http://www.only2fire.com/archives/131.html
注:转载请注明出处,谢谢!^_^