函数调用流程
我们知道,函数调用时需要一定的时间和空间的开销。 函数的调用过程可以做如下理解:
1.程序先执行函数调用之前的语句 2.流程的控制转移到被调用函数的入口处,同时进行参数传递 3.执行被调用函数中函数体的语句 4流程返回到函数调用的下一条指令处,将函数返回值带回 5接着执行主函数中未执行的语句。
这样的调用过程,就要求在转去被调用函数之前,要记下当时执行的指令的地址,还要保护现场(记下当时相关的信息),以便在函数调用之后,流程返回到先前记下的地址处,并且根据记下的信息恢复现场,然后继续执行。这些都要花费时间。 c++提供一种提高效率的方法,在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去,这种嵌入到主函数的代码称为内嵌函数,或者叫内置函数,或者叫内联函数。
声明内联函数
指定内联函数的方法很简单,只需在函数首行的左端加一个关键字inline即可。
#include<iostream>
using namespace std;
inline int max(int, int,int c);
int main()
{
int i = 10, j = 20, k = 30;
cout << max(i, j, k) << endl;
return 0;
}
inline int max(int a,int b,int c)
{
if (b > a)
a = b;
if (c > a)
a = c;
return a;
}
注意:
可以在声明和定义函数时同时写inline,也可以只在函数声明时加inline,而定义时不加inline。主要在调用该函数之前把inline的信息告诉编译系统,编译系统就会在处理函数调用时按内联函数处理
应当说明的是:
对函数做inline声明,只是程序设计者对编译系统提出的一个建议,也就是说它是建议性的,不是指令性的。并非一经指定为inline,编译系统就必须这样做。编译系统会根据具体的情况决定是否这样做。内联函数inline一般要是定义在头文件中,这与通常的函数定义是不一样的。
inline与宏定义区别
简单的讲inline的作用与 宏定义 作用相同,但是又不尽相同。 具体来说
宏定义
宏定义可以定义变量和表达式。
1、 C中使用define这种形式宏定义的原因是因为,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用 预处理器实现,没有了 参数压栈,代码生成等一系列的操作,因此,效率很高,这是它在C中被使用的一个主要原因。
2、这种 宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器 符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++ 编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。
3、在C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this 指针放在合适的位置)。
简单的概括就是宏定义表达式或函数,无法发挥宏定义最大化,为了避免这些缺点,引入了 inline,这个inline既吸收了宏定义的优点,又扩展了宏定义。
inline推出的目的就是消除宏定义的缺点,同事又很好地继承了宏定义的优点。
内联函数
inline的作用如下:
1、inline 定义的内联函数,函数的代码被放入 符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。
2、很明显,类的内联函数也是一个真正的函数, 编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
3、inline 可以作为某个 类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。
|