内联函数

来源:互联网 发布:图像对比分析软件 编辑:程序博客网 时间:2024/05/18 21:41
    内联函数的优点是提高运行时间效率,缺点是增加了空间开销    对于普通函数,函数调用需要时间和空间开销,调用函数实际上将程序执行流程转移到被调函数中,被调函数的代码执行完后,再返回到调用的地方。这种调用操作要求调用前保护好现场并记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但对于一些函数体代码很短,又被频繁调用的函数,就不能忽视这种开销。引入内联函数正是为了解决这个问题,提高程序的运行效率。    对于内联函数,在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。由于在编译时将内联函数体中的代码替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间开销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。    

主要是节省时间..

函数调用时 调用函数跳转到函数体代码段的时间 大于 函数体本身所执行的时间..那调用内联函数可以节省时间.

反过来,函数执行时间大于 调用函数跳转到函数体代码段的时间 那用内联函数是没任何作用,反而增加了代码量.

       内联函数和宏的区别?

       内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。内联函数与带参数的宏定义进行下比较,它们的代码效率是一样,但是内联欢函数要优于宏定义,因为内联函数遵循的类型和作用域规则,它与一般函数更相近,在一些编译器中,一旦关上内联扩展,将与一般函数一样进行调用,比较方便。



       我们也可以将定义在类的外部的函数定义为内联函数,比如:
    Class TableClass{
    
 Private:
    
  Int I,j;
    
 Public:
    
  Int add() { return I+j;};
    
  Inline int dec() {return I-j;}
    
  Int GetNum();
    
}
    
inline int tableclass::GetNum(){
    
return I;
    
}
    
    

    上面申明的三个函数都是内联函数。在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。
    内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。
    Class sample{
    
 Private:
    
  Int nTest;
    
 Public:
    
  Int readtest(){ return nTest;}
    
 Void settest(int I) {nTest=I;}
    
}
    
    

    当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了