【C++】内联函数(inline)和宏定义(# define)的优劣及其区别

一.宏定义:# define

1.为什么要使用宏?

因为调用宏比调用函数更有效率,函数的调用必须要将程序的执行顺序转移到函数所存放的内存地址中,将函数程序内容执行完后,再返回到执行该函数前的地方,这种转移操作要求执行前要保存现场并记忆执行地址,转回后要恢复现场,并按原来保存的地址继续执行,因此,函数调用有一定的时间和空间的开销,而宏只是在预处理的地方把代码展开,不需要额外的时间和空间开销,所以调用一个宏比调用一个函数更有效率

2.宏定义的最大好处:

宏定义的使用上像一个函数,但不是函数,它使用预处理器实现,没有了参数压栈,代码生成等一系列操作,因此效率很高

3.宏定义的缺点:

1)虽然宏定义类似一个函数,但在使用时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也就不能被强制转换为可转换的合适类型

2)宏定义不能访问类的成员变量

3)宏定义使用参数时,是严格的替换策略,无论你得参数时是何种形式,在展开代码中都是用形参数代替实参,这样,宏定义很容易产生二义性,它的使用就存在一系列的隐患


二.内联函数:inline

扫描二维码关注公众号,回复: 7388650 查看本文章

1.内联函数的介绍:

内联函数从源代码层看,有函数结构,而在编译后,却不具备函数性质,内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入每一个调用处,编译时,类似宏替换,使用函数体替换调用处的函数名,在代码中用inline关键字修饰,在类中声明的成员函数,自动转换为内联函数

1)类中的成员函数默认是内联函数(要求成员函数没有循环和递归,当其中存在循环的递归的时候,编译器会将其默认为一个普通函数处理)

2)内联函数不允许有循环或者递归语句

3)内联函数的定义必须出现在第一次调用内联函数之前

2.内联函数的优点:

1)有参数类型检测,更加安全

2)内联函数是在程序运行时展开,而且是进行参数传递

3)inline关键字只是对编译器的一个定义,如果函数本地不符合内联函数的标准,编译器就会将这个函数当作是普通函数

3.内联函数的缺点:

1)因为内联函数是在调用处展开,所以会使代码边长,占用更多内存


三.内联函数和宏定义的主要区别:

1)内联函数在运行时可调试,而宏定义不可以

2)编译器会对内联函数的参数类型做安全检查或自动类型转换,而宏定义则不会

3)内联函数可以访问类的成员变量,而宏定义则不能


猜你喜欢

转载自www.cnblogs.com/yinbiao/p/11606554.html