内联函数的特点及注意事项

19 篇文章 0 订阅

内联函数

  1. 如果代码中有一些函数频繁的调用,那么会不断的函数参数入栈、出栈,会造成代码时间上的浪费,为了解决这个问题,特别引入了inline修饰符,表示内联函数。

  2. 内联函数就和带参数宏类似,都是使用函数体直接替换调用处的代码,所以不需要参数入栈出栈,节约了时间!

  3. 但是需要注意的是,内联函数只适合函数功能简单,操作少,被调用多的条件下,这样才能对代码效率进行提升。当内联函数中,函数体功能复杂,需要循环、嵌套等大量操作,那么当内联函数体在编译时替换调用处代码,会占据大量的内存,而且编译的时间有可能也会大大增加,造成的影响远远大于不使用内联函数!

  4. 内联函数与带参数宏定义的区别

    1. 宏调用并不执行类型检查(任意类型皆可),但是函数调用却要检查。

    2. 宏替换发生在预处理阶段,函数发生在编译阶段

    3. 宏是简单的文本替换会出现意想不到的错误,而函数不会,如

      #define ADD(x, y) x * y
      inline int add(int x , int y)
      {
          return x * y;
      }
      
      int main()
      {
          int a = 1, b = 2, c = 3, d = 4;
          cout << "add(a, b) = " << add(a+b, c+d) <<endl;
          cout << "ADD(a, b) = " << ADD(a+b, c+d) <<endl;
          return 0;
      }
      
      add(a, b) = 21
      ADD(a, b) = 11
      

      执行结果:内联函数add的结果是正确的,但是宏ADD是错误的,那么为什么是11呢?只要展开就明白了;调用点展开:cout << "ADD(a, b) = " << 1+2*3+4 <<endl;那么结果肯定是11啊,所以对于经验不是特别丰富的程序员使用带参数宏,很容易出现错误!

      那么有经验的该怎么写呢?#define ADD(x, y) ((x) * (y)),这样,就不会出错了!

  5. 内联函数的定义一般直接写在头文件中,因为内联函数在编译时是直接将函数体替换调用点的代码的(你可以理解成类似宏展开),所以如果内联函数定义在某xx.cc中,声明是定义在头文件中,那么当调用内联函数的时候,在编译阶段调用该内联函数的代码被替换成函数体,那么就不会再有该内联函数的函数名了,链接器自然无法解析。

  6. 当然你如果非要将内联函数声明写在头文件,定义在xx.cc中,然后还想在aa.cc中调用在xx.cc中的内联函数,那么需要在头文件中加上#include "xx.cc",这种写法多此一举,不建议这样操作!
    本人能力有限,如有错误望各位大佬不吝指正,原创不易,转载请注明出处!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值