函数内联

    关键字inline修饰的函数就是内联函数,inline必须与函数的定义体放在一起才能使函数称为内联,而将inline放在函数的声明之前是不起作用的。

inline和static两个关键字的比较?

    相同点:它们修饰的符号都是仅当前文件可见的。

    不同点:static修饰的函数在符号表中产生符号,但是符号都是local的,在链接时不受链接器的处理。inline修饰的函数最终是不在符号表中产生符号的。

inline函数和普通函数的区别?

    在调用内联函数的调用点,直接将函数的代码展开,也就是说,在调用内联函数的时候,没有栈桢的开辟和回退过程。

      而当调用一个普通函数时,会为函数开辟栈桢,压参入栈,生成汇编语言的调用,执行return的过程,相比之下就增加了函数的开销。

用内联取代宏   

      在c语言中,我们常使用宏来提高代码的执行效率,而我们都知道,对宏的处理是在预编译的阶段,预处理器用复制宏代码的方式代替函数调用,从而省去了开辟栈桢、汇编等过程,从而提高速度。而宏最大的问题就是太容易出错了,在预编译时只进行替换不进行类型检查,函数容易产生意想不到的隐患。

     而对于任何内联函数,编译器在符号表中放入函数的声明,如果编译器没有发现内联函数存在错误,那么该函数的代码也就被放到符号表中。在调用一个内联函数时,编译器首先检查调用是否正确(进行类型安全检查)。如果调用正确,内联函数的代码就会直接替换函数的调用,省去了函数的开销。

      相比于宏,内联函数会进行类型检查,或者自动类型转换,假如内联函数时成员函数,对象的地址会被放在合适的地方,这也是宏办不到的。

      内联函数既具备宏代码的效率,又增加了安全性,并且可以自由操作类的数据成员,所以相比之下,inline的使用更加好一点。

**************************************************************     

      虽然说在C++程序中,最好用inline替换所有的宏,但断言"assert"是例外,assert是仅在debug版本下检查“不应该”发生的情况。为了不让程序在debug版本和Release版本引起差别,assert不应该产生任何作用。如果assert是一个函数,那么会引起代码、内存的变动,从而会导致debug版本和Release版本引起差别。所以assert不是函数,而是宏。    

        

谨慎使用内联函数:

      内联是以代码的膨胀为代价,省去函数调用的开销,从而提高函数的执行效率。所以如果1)函数体内代码较长,使用内联函数将导致内存消耗代价较高 2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

         所以在使用内联函数的时候,需要谨慎使用,以使得函数的效率更高。

            

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值