C++函数调用过程和内置函数详解

时间:2022-09-22 09:08:08
C++函数调用过程和内置函数详解
       上图表示 函数调用过程:①程序先执行函数调用之前的语句;②流程的控制转移到被调用函数入口处,同时进行参数传递;③执行被调用函数中函数体的语句;④流程返回调用函数的下一条指令处,将函数返回值带回;⑤接着执行主调函数未执行的语句。

        这样就要求在转到被调用函数之前,要 记下当时执行的指令的地址,还要“保护现场”(记下当时有关的信息),方便在函数调用之后继续执行。在函数调用之后,流程返回到先前记下的地址处,并且根据记下的信息“恢复现场”,然后继续执行。这一些都会花费一定的时间。如果有的函数需要频繁的使用,则所用时间会很长,从而降低程序的执行效率。有些实用程序对效率是有要求的,要求系统的响应世间短。这就希望尽量压缩时间的开销。

         C++提供了一种提高效率的方法,即在编译的时候将所调用的代码直接嵌入到主调函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为 内置函数(inline function),又称 内嵌函数。有些书把它译成 内联函数

          用法:在函数首行的左端加一个关键字inline即可。
实例:
#include <iostream>
using namespace std;
inline int max(int,int,int);//声明函数
int main()
{
int i = 10;
int j = 20;
int k = 30;
int m;
m = max(i,j,k);
cout << "max=" << m << endl;
return 0;
}
inline int max(int a; int b; int c)//定义max为内置函数
{ //求a,b,c中的最大者
if (b > a)
{
a = b;
}
if (c > a){a = c;}return a;}由于定义函数时指定它为内置函数,因此编译系统在遇到函数调用“max(i,j,k)”时,就用max函数体的代码代替“max(i,j,k)”,同时将 实参代替形参。这样程序第10行“m = max(i,j,k);"就被置换成
if(j > i) i = j;
if(k > i) i = k;
m = i;
注意,可以在声明函数和定义函数时同时写inline,也可以只是其中一处声明inline,效果相同,都能按内置函数处理。

        使用内置函数可以节省运行时间,但却增加了目标程序的长度。假设要调用10次max函数,则编译时先后10次将max代码复制并插入main函数,这就增加了目标文件main函数的长度。因此一般只将规模很小(一般为5个语句以下)而使用频繁的函数(如定时采集数据的函数声明为内置函数)。在函数规模很小的情况下,函数调用的时间开销可能相当于甚至超过执行函数本身的时间,把它定义为内置函数,可 大大减少程序的运行时间

        内置函数中不能包括复杂的控制语句,如循环语句和switch语句。
        
        对函数做inline声明,只是程序设计者对编译系统提出的一个建议,它是建议性的,而不是指令性的。并非指定为inline,编译系统必须这样做。它是根据具体情况决定的。例如对前面提到的包含循环语句和switch语句的函数或一个递归函数是无法进行代码置换的,又如一个1000行的函数,也不太可能在调用点展开。此时编译系统就会忽略inline声明,而按普通函数处理。
      
        总结只有规模较小而又频繁调用的简单函数,才适合于声明为inline函数