内联函数(inline)和宏定义(#define)有些类似,但也有不同。
#define用参数时,是严格的替换策略,而 内联inline 则不一样。
太详细和基础的东西就不在这里讲了。
首先我们都明白,宏定义是严格的替换,
那么为什么要使用宏呢?
因为函数的调用必须要将程序执行的顺序:(执行以下三步)
1. 转移到函数所存放在内存中的地址,
2. 将函数程序内容执行完后,
3. 返回到转去执行该函数前的地方。
这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。
因此,函数调用要有一定时间和空间方面的开销,将影响其效率。
而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。
所以宏定义最大的好处是:
但它使用预处理器实现,没有了参数压栈,代码生成 等一系列的操作,效率很高。
当然宏定义也有缺点,最经典的就是老师会在课堂上讲的:
1 2 |
#define ADD(a,b) a+b printf("%d",3*ADD(2,5)); |
具体不讲解,如果当函数看,结果应该是21,实际结果是11
所以缺点:
1. 这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,和局限性。
2.宏不能访问对象私有成员。
3.#define用参数时,是严格的替换策略。无论你得参数时何种形式,在展开代码中都是用形参替换实参。这样,宏的定义很容易产生二意性,它的使用就存在着一系列的隐患
以下代码值得阅读运行一下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <iostream> using namespace std; #define Max( a , b ) ( a > b ? a : b); inline int fun( int a , int b ) { return ( a > b ? a : b ) ; } int main() { int a , b ; a = 3 ; b = 0 ; Max( ++a , b ) ; cout << a << endl ; a = 3 ; b = 5 ; Max( ++a , b ) ; cout << a << endl ; a = 3 ; b = 0 ; fun( ++a , b ) ; cout << a << endl ; return 0 ; } |
内联函数:
从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。
内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。
编译时,类似宏替换,使用函数体替换调用处的函数名。
一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。
在类中声明同时定义的成员函数,自动转化为内联函数。
二者区别:
1.内联函数在运行时可调试,而宏定义不可以;
2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
3.内联函数可以访问类的成员变量,宏定义则不能;
总之,在c++中,建议用内联 和 const 取代 #define…