内联函数

为什么要引入内联函数:


      引入内联函数的主要目的是,用它替代c语言中表达式形式的宏定义来解决程序中函数调用的效率问题,在c语言里可以使用如下的宏定义:
#define ExpressionName(Var1,Var2)  (Var1+Var2)*(Var1-Var2)
    这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈、代码生成等一系列的操作,因此效率更高。这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受c++编译器严格类型检查的好处。另外,它的返回值也不能被强制转换为可转换的合适类型,这样,它的使用就存在着一系列的隐患和局限性 。
   另外,在c++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。
   inline推出的目的,也正是为了取代这种表达式形成的宏定义,它消除了它的缺点,同时又很好地继承了它的优点。

为什么inline能很好地取代表达式的预定义:


   (1)inline定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换(像宏一样展开),没有了调用的开销,效率也很高。
   (2)类的内联函数也是一个真正的函数。编译器在调用一个内联函数时,首先会检查它的参数类型,保证调用正确;然后进行一系列的相关检查,就像对待一个真正的函数一样。这样就消除了它的隐患和局限性。
   (3)inline可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员

内联函数使用的场合:


    内联函数在c++类中应用最广泛的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。如下代码:
class A
{
   Private:
              int nTest ;
   Public:
              int readTest()
              {
                     return nTest ;
              }
              void setTest(int i) ;
};

inline void A::setTest(int i)
{
     nTest = i ;
};

    类A的成员函数readTest()和setTest()都是inline函数。readTest()函数的定义体被放在类声明之中,因而readTest()自动转换成inline函数;setTest()函数的定义体在类声明之外,因此要加上inline关键字。

为什么不把所有的函数都定义成内联函数


  内联是以代码膨胀(复制)为代价的,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。有以下几种情况不宜使用内联:
    (1)如果函数体内的代码比较长,使用内敛将导致内存消耗代价较高
    (2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大
    (3)另外,类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一                些行为,如“偷偷地”执行了基类或成员对象的构造函数和析构函数
   所以不要随便地将构造函数和析构函数的定义体放在类声明中。一个好的编译器将会根据函数的定义体,自动的取消不值得的内联(这说明了inline不应该出现在函数的声明中)。

内联函数与宏有什么区别


  (1)内联函数在编译时展开。宏在预编译时展开
  (2)在编译的时候,内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的文本替换
  (3)内联函数可以完成诸如类型检测、语句是否正确等编译功能,宏就不有这样的功能
  (4)宏不是函数。inline函数是函数
  (5)宏在定义时要小心处理宏参数(一般情况是把参数用括号括起来),否则容易出现二义性。而内联函数定义时  不会出现二义性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值