内敛函数inline

来源:互联网 发布:ubuntu 重置root密码 编辑:程序博客网 时间:2024/04/24 00:03

函数的引入可以减少程序的目标代码,实现程序代码的共享。

函数调用需要时间和空间开销,调用函数实际上将程序执行流程转移到被调函数中,被调函数的代码执行完后,再返

回到调用的地方。这种调用操作要求调用前保护好现场并记

忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但对于一

些函数体代码很短,又被频繁调用的函数,就不能忽视这种

开销。这个时候就需要引入内敛函数来解决这个问题,提高程序的运行效率。

我们先来看下面的函数: 

    double Average(double total, int number)

      return total/number;

      } 

定义这么简单的函数有必要吗?实际上,它还是有一些优点的:第一,它使程序更可读;第二,它使这段代码可以重

复使用。

但是,它也有缺点:当它被频繁地调用的时候,由于调用函数的开销,会对应用程序的性能(时间+空间效率,这儿特

指时间)有损失。

例如,Average在一个循环语句中重复调用几千次,会降低程序的执行效率。

 为了解决上面的问题,我么可以把它定义为内敛函数的形式:

    inline double Average(double total, int number)

{

      return total/number;
    }

这样就可以提高程序的运行效率。

内敛函数一般规模较小,程序再调用这些成员函数时,不是真正的执行函数的调用过程(如保存返回地址等处理),

而是把函数代码嵌入程序的调用点(内敛函数在源文件中不是调用而是按原样展开),这样可以大大减少调用成员函

数的时间。内敛函数是提高运行时间效率,但却增加了空间开销。即内敛函数目的是:为了提高函数的执行效率

(速度)。

从定义上看内敛函数似乎和宏函数有些相像,但是我们需要记住内敛函数与宏函数的本质区别:

在C中可以用宏函数提高执行效率,宏函数不是函数但使用起来像函数,编译器用复制宏函数的方式取代函数调用,

省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高速度。

而内敛函数是通过编译器控制来实现的。而且内敛函数是真正的函数,只是在需要用到的时候,内敛函数像宏一样的

展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内敛函数,而不必担心会产生

于处理宏的一些问题。

还有最重要的一点是宏函数是用编译时间换内存空间,而内敛函数是用内存空间换执行时间。

使用内联函数时应注意以下几个问题:

(1) 在一个文件中定义的内敛函数不能在另一个文件中使用。它们通常放在头文件中共享。

(2) 内敛函数应该简洁,只有几个语句,如果语句较多,不适合于定义为内敛函数。 

(3) 内敛函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把

该函数作为非内敛函数处理。

(4) 内敛函数要在函数被调用之前声明。

例如:

#include <iostream.h>
int increment(int i);

inline int increment(int i)

{

  i++; 

return i;

}

void main(void)

{  

……

}

如果我们修改一下程序,将内敛函数的定义移到main()之后: 

    #include <iostream.h>
int increment(int i);

void main(void)

{  

    ……

}

//内敛函数定义放在main()函数之后

inline int increment(int i)

{

  i++; 

return i;

}

内敛函数在调用之后才定义,这段程序在编译的时候编译器不会直接把它替换到main中。也就是说实际上"increment(int i)"只是作为一个普通函数被调用,并不具有内敛函数的

性质,无法提高运行效率。

0 0
原创粉丝点击