Keil 函数内联 inline

179 篇文章 176 订阅

    内联函数是指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度,但是因为把内联函数拷贝了很多份,所以程序大小也变大了。


    当我们在程序里调用函数时,要花时间执行下面几个步骤:

    1. 保护现场,就是先将主调函数里的函数调用返回后要执行的指令的地址压入栈中保存;
    2. 把被调函数的形参和auto存储类型的变量压入栈区保存,这一步压入的所有变量所占有的存储我们称之为被调函数的数据现场;
    3. 执行完被调函数之后,把被调函数数据现场释放(出栈);
    4. 把第1步压入的指令地址出栈,即恢复现场,然后找到这个地址继续执行。

    因此要是程序中一个函数被调用了许多次,那么编译系统需要来来回回的往返许多趟,产生栈内存创建和释放的开销时间,于是C++(C99)的编译系统提供了一个方法。在被调函数的定义前加一个标志(inline)告诉编译系统,编译系统看到这个标志后,实际编译出的可执行程序,就如同用函数体合理地置换了函数被调用处一样,我们称之为内联机制。

    内联函数的工作过程:
    当定义了一个函数之后,编译器会将其编译成一个指令集合。这个指令集合在程序运行的时候会出现在内存的代码区里,并且在调用此函数时程序执行的地址会跳转到这个指令集合的入口地址,当指令集合执行完后,再跳回到主调函数。换句话说,任何时候内存中只有一个指令集,如果该函数被调用10次,则运行时就会跳转到同一入口地址10次。

    如果定义为inline函数,编译器并不创建真实函数,内联函数不仅同普通函数一样经过检查后保存函数名称、参数类型和返回值类型,还会把内联函数的本体也一并存入符号表中,在之后的编译过程中一旦遇到该函数被调用时会首先检查调用是否合法,然后编译器会将inline函数的指令集合(函数代码)复制嵌入到主调函数中的调用位置,内联函数的代码就会直接替换函数调用,这样就不需要函数调用的跳转开销了。如果函数被调用了10次,就相当于内存中就包含10个相同指令集合的拷贝,没有一次调用。

    了解了内联函数是怎么工作的,那么内联机制的优劣就好理解了。需要清楚的是,我们定义为inline函数只是建议编译器进行内联,而不是命令编译器进行内联,所以最后是不是内联函数取决于编译器。还有关键字inline必须与函数定义放在一起才能使函数成为内联(最后由编译器决定),仅放在函数声明前面不起作用。因为inline是在编译时展开,必须有实体,在编译阶段,编译器看到inline标志就会根据该函数体情况去判断是否应该将该函数体定义为内联。

    因此决不决定把函数内联,实际上是空间和时间上的博弈,函数内联是典型的空间换时间的方法。


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值