0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

内联函数定义 为什么需要内联函数

嵌入式与Linux那些事 来源:嵌入式与Linux那些事 2024-02-19 12:20 次阅读

内联函数定义

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

为什么需要内联函数

C语言中,如果一些函数被频繁的调用,不断地用函数入栈,即函数栈,则会造成栈空间或者栈内存的大量消耗,为了解决这个问题,特别的引入了inline关键字,表示为内联函数。

栈空间指的是函数内数据的内存空间,在一个系统下,栈空间的资源是有限的,假如频繁大量的使用就会因栈空间的不足而导致出错,函数的死循坏递归调用的最终结果就是导致栈内存空间的枯竭。

#include
//函数定义为inline即:内联函数
inlinechar*dbtest(inta){
return(i%2>0)?"奇":"偶";
}

intmain()
{
inti=0;
for(i=1;i< 100; i++) {
       printf("i:%d    奇偶性:%s /n", i, dbtest(i));    
   }
}

上面的例子就是标准的内联函数的用法,使用inline修饰带来的好处我们表面看不出来,其实,在内部的工作就是在每个for循环的内部任何调用dbtest(i)的地方都换成了(i % 2 > 0) ? "奇" : "偶",这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。

内联函数注意事项

关键字inline必须与函数的定义体放在一起,才能使函数成为内联函数,仅仅将inline放在函数声明前面不起作用

如下风格的函数fun则成为内联函数:

voidfun(intx,inty);
inlinevoidfun(intx,inty)//inline与函数的定义放在一起
{

}

关键字inline的使用是有所限制的

inline只适合函数体内代码比较简单的函数使用,不能包含复杂的结构控制语句,例如while、switch,并且内联函数本身不能是直接递归函数(函数内部调用自己的函数)。

inline仅是一个对编译器的建议

inline函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。

建议:inline函数的定义放在头文件中

其次,因为内联函数要在调用点展开,所以编译器必须随处可见内联函数的定义,要不然就成了非内联函数的调用了。所以,这要求每个调用了内联函数的文件都出现了该内联函数的定义

因此,将内联函数的定义放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦。

声明跟定义要一致:如果在每个文件里都实现一次该内联函数的话,那么,最好保证每个定义都是一样的,否则,将会引起未定义的行为。如果不是每个文件里的定义都一样,那么,编译器展开的是哪一个,那要看具体的编译器而定。所以,最好将内联函数定义放在头文件中。

static和inline联合使用

static是静态修饰符,由其关键字修饰的变量会保存到全局数据区,对于普通的局部变量或者全局变量,都是由系统自动分配内存的,并且当变量离开作用域的时候释放掉,而使用static关键字来修饰,只有当程序结束时候才会释放掉,使用static inline修饰时,函数仅在文件内部可见,不会污染命名空间,另外,函数在运行过程中也会分配内存空间,但是由于static的存在,就和修饰变量类似,它只会开辟一块内存空间。

内联函数优缺点

普通函数在调用过程中,会对寄存器中内容进行上下文切换(push和pop操作),而内联函数则不需要,所以普通函数相比内联函数,耗时要多一些

当函数使用次数比较多的时候,内联函数在每个调用的地方都会被展开,所以导致固件大小会变大,同一段代码会多次重复出现在固件中。而普通函数则没有此问题,不管调用的函数的次数多少,函数在固件中均只占用一处,空间利用率较高。inline函数其实就是空间换时间

inline 和宏的区别

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

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

总结

内联函数相比宏函数,会进行语法检查。宏函数是在预处理阶段生效,内联函数是在编译阶段进行语法检查然后替换。

内联函数相比普通函数,少了上下文切换的步骤所以执行会更快一些。

内联函数被多次调用,会使固件大小膨胀,内联函数的高速是以空间来换时间。

内联函数不可递归。

如果函数内容太过于复杂,编译器会忽略inline关键字,把他当成普通函数来处理。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7533

    浏览量

    128790
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48625

原文标题:【C语言】内联函数总结

文章出处:【微信号:嵌入式与Linux那些事,微信公众号:嵌入式与Linux那些事】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RealView MDK中使用内联函数需要注意的问题

    的文件中申明为extern类型。原因是MDK中使用的__inline函数时和标准C++中的inline函数有相同的语义。在C++标准中,一个内联函数在用到它的每个解释单元
    发表于 08-02 10:10

    内联函数简介

    1.内联函数在C++中我们通常定义以下函数来求两个整数的最大值:复制代码 代码如下:int max(int a, int b){return a > b ? a : b;}为这么一个小
    发表于 09-11 16:22

    基于SUIF的函数内联技术

    从基于调用图的函数内联技术、函数参数的映射技术和内联使用的不同策略3 个方面讨论基于SUIF 系统的内联技术的实现。根据KAP 系统需求,提
    发表于 03-28 09:50 6次下载

    C++如何处理内联函数

    当一个函数内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄 清楚内联和虚函数,让我们将它们分开来考虑。通常,一个
    发表于 11-29 11:59 28次下载

    内联函数详解

    什么是内联性和外联函数 类的成员函数可以分为内联函数和外联函数
    发表于 11-02 14:05 0次下载

    内联函数和外联函数有什么区别

    内联函数是指用inline关键字修饰的函数。在类内定义函数被默认成内联
    发表于 12-15 11:52 5483次阅读
    <b class='flag-5'>内联</b><b class='flag-5'>函数</b>和外联<b class='flag-5'>函数</b>有什么区别

    Java之内联函数_内联函数的优缺点

    内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度。Java语言中有一个关键字final来指明那
    发表于 12-15 15:00 3107次阅读

    C++基础语法之inline 内联函数

    函数处; 相当于不用执行进入函数的步骤,直接执行函数体; 相当于宏,却比宏多了类型检查,真正具有函数特性; 编译器一般不内联包含循环、递归、
    的头像 发表于 09-09 09:38 1857次阅读

    C++语法中的inline内联函数详解

    函数处; 相当于不用执行进入函数的步骤,直接执行函数体; 相当于宏,却比宏多了类型检查,真正具有函数特性; 编译器一般不内联包含循环、递归、
    的头像 发表于 09-09 09:33 3186次阅读

    msp430学习1——msp内联函数

    你通过 锁相环倍频来提高系统运行速度是有一个限制的, 最高只能到25MHZ(再高没意思了)。 (2)几个重要的内联函数内联
    发表于 12-16 16:56 7次下载
    msp430学习1——msp<b class='flag-5'>内联</b><b class='flag-5'>函数</b>

    C语言-内联函数、递归函数、指针函数

    这篇文章介绍C语言的内联函数、递归函数函数指针、指针函数、局部地址、const关键字、extern关键字等知识点;这些知识点在实际项目开发
    的头像 发表于 08-14 10:03 1376次阅读

    讲解下C语言的内联函数

    内联函数是C语言从C++中借鉴过来的,适当的使用内联函数可以提高程序的执行效率。
    的头像 发表于 02-16 09:15 1034次阅读

    C语言内联函数,提升C技巧必备

    内联函数是C语言从C++中借鉴过来的,适当的使用内联函数可以提高程序的执行效率。本篇文章就来讲解下内联
    的头像 发表于 02-16 09:16 577次阅读

    C语言内联函数

    函数B很小,又被频繁的调用,可能函数调用的切换时间比函数内代码的执行时间还长,这样明显划不来,那么我们就可以将这个函数声明为内联(加上 in
    的头像 发表于 02-21 16:55 627次阅读
    C语言<b class='flag-5'>内联</b><b class='flag-5'>函数</b>

    宏的缺陷与内联函数的引入

    。 所以为了解决这种不利于调试的问题,就有了内联函数。 那么什么是内联函数呢? 我们以inline修饰的函数叫做
    的头像 发表于 11-01 17:57 232次阅读