cpp——内联函数是什么

内联函数的概念:

        被inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数是提升函数调用的效率。

        有一个add函数,如果频繁地去调用它10次,那就得建立10次栈帧,栈帧里面需要做不少的事情,要保存寄存器、压参数、压返回值等等一系列的操作,效率是很低的。

int Add(int num1, int num2)
{
	return num1 + num2;
}

int mani()
{
	//频繁调用短小的函数效率低
	Add(1, 2);
	Add(1, 2);
	Add(1, 2);
	Add(1, 2);
	Add(1, 2);
	Add(1, 2);
	Add(1, 2);
	Add(1, 2);
	Add(1, 2);
	Add(1, 2);

	return 0;
}

        在c语言的中,是如何去提高频繁调用且短小函数的效率呢?c语言是用宏来解决的。使用带参的宏定义既可以完成函数调用的功能,又能避免函数开辟栈帧等一系列操作,能很好地减少系统开销,提高运行效率。

#define ADD(x,y) ((x)+(y))

int main()
{
	printf("%d\n", ADD(2, 2));
	return 0;
}

        宏替换虽然能提高运行效率,但稍微不注意也是很容易出错的。

        来看看下面的这个宏,会认为结果应该是9啊,怎么结果变成5了,原因就在于宏的使用不当了 ,没有给每个参数用括号括起来,从而导致在宏替换的时候出现了优先级的问题。

//正确的写法
//#define MULTIPLY(x,y) ((x)*(y))

//错误:每个参数都不带括号
#define MULTIPLY(x,y) (x*y)

int main()
{
	//本来结果应该是9 的,为什么变成5了呢?
	int ret = MULTIPLY(2 + 1, 3);	//因为宏替换后发生了优先级问题:2 + 1 * 3 因此结果变成了5
									//如果有给每个参数加上括号的话:(2+1)*(3)  结果就是9了

	printf("%d\n", ret);

	return 0;
}

        因为宏很容易出错且不易读懂,所以c++中就有了内联函数来解决这些的问题。

        来看看c++中是如何使用内联函数的。

//在返回值类型前面加上inline
inline int Add(int num1, int num2)
{
	return num1 + num2;
}

int main()
{
	cout << Add(1, 2) << endl;

	return 0;
}

        内联函数:1、是支持调试的,宏不能调试。 2、不易写错,就是普通函数的写法,只需在返回值类型前面加上inline即可。

注意事项:

1. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长(一般是10行以上就算长)或者有循环、递归的函数不适宜作为内联函数,因此内联函数适合1~5行以内的小函数来使用。
2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归、代码过长等等,编译器优化时会忽略掉内联。
3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值