【C++】内联函数和宏的区别

内联函数

内联函数指的是用[ inline ]关键字修饰的函数,在类体内定义的函数会被默认定义为内联函数

特性

内联函数会在【编译】期间进行替换,就是将调用该函数的地方换成【函数体】(类似于C语言中的宏,然而宏是在【预处理】阶段进行替换)

内联函数和宏的不同之处

1、类型检测

我们先定义一个MAX宏

#include<stdio.h>
#include<stdlib.h>

#define MAX(a,b) (a>b)?a:b

int main()
{	
	int a = 10;
	int b = 20;
	int ret = MAX(a,b);
	printf("ret = %d\n",ret);
	system("pause");
	return 0;
}
上面便定义了一个MAX的宏,可以求a和b的大小

然而,利用宏是有问题

#define MAX(a,b) (a>b)?a:b

int main()
{	
	int a = 10;
	int b = 20;
	int ret = MAX(a++,b);
	printf("ret = %d\n",ret);
	system("pause");
	return 0;
}
如果用MAX(a++,b)

则这个是含有副作用的

#define MAX(a,b) (a>b)?a:b

int main()
{	
	int a = 10;
	int b = 20;
	int ret = MAX(a++,b);//利用宏,a的值会被修改
	printf("ret = %d\n",ret);
	system("pause");
	return 0;
}
上例便说明了宏传入含有 【副作用参数】便会有影响

内联函数便很好的解决了这个问题

内联函数是毕竟是【函数】,有【参数类型】的判断。

2、替换时机不同

内联函数在【编译】的时候替换

宏在【预处理】阶段进行替换

3、替换的成功率

宏一旦定义则在【预处理】阶段一定会替换

内联函数仅仅是对【编译器】的一个建议

如果编译器觉得该函数不适合成为内联函数时,便会忽略前面的[ inline ]关键字

比如当我们将一个【递归】函数,如果编译器不进行检测,那么文件就会无限的扩大下去

此时,【编译器】便会忽略[ inline ]关键字

总结

总的来说,【内联函数】是消除【函数调用】时的开销。

和宏类似,一个小的函数声明成【内联函数】可以非常受益。

并且避免了宏传【副作用参数】的所造成的错误。

不管自己定义内联函数与否,【编译器】会根据自己的判断来决定是否内联

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值