为了账号安全,请及时绑定邮箱和手机立即绑定

递归函数若是内联(inline)函数,是否就不需要函数调用时的大开销了?

递归函数若是内联(inline)函数,是否就不需要函数调用时的大开销了?

慕斯王 2019-02-26 07:03:52
递归函数若是内联(inline)函数,是否就不需要函数调用时的大开销了?
查看完整描述

3 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

递归是内联的话,编译器如何编译?
递归的处理方法是讲函数调用层层入栈,通过出栈来调用每层的函数;
如果写成内联,编译器编译时都搞不清楚了吧,更别谈调用了。

查看完整回答
反对 回复 2019-03-26
?
大话西游666

TA贡献1817条经验 获得超14个赞

#include <stdio.h>
inline int fact(int n)
{
if(n<=1)
{
return 1;
}
else
{
return n*fact(n-1);
}
}

int main()
{
int n;

printf("Input n:");
scanf("%d",&n);
printf("n!=%d\n",fact(n));
return 0;
}
上面,我把计算阶乘的fact函数,声明为内联函数了,照样能正常编译,正常运行,结果也正确

我们知道,内联函数,在编译的时候,就对它进行了展开
这样做的后果是:
提供程序执行的速度,因为不需要调用函数所进行的堆栈操作了
但它会增加代码的长度,因此,当函数很长的时候,不建议使用内联的方式

但考虑到递归函数,编译器不可能无限展开的,而上面的例子又是可以的
所以,我猜想:
这种递归的情况下,即使声明成内联的,编译也不报错,
但实际上,仍然不是按内联的方式进行处理

对比了一下内联和不内联两种情况下的obj和exe文件,发现他们的大小都是一样的:
aaa.obj 3,414 字节
aaa.exe 163,926 字节
也许这就证明了我的猜想吧

补充:
c语言当然不支持内联啊,c++才有这个概念。
我之所以编译没有错,说明我用的是c++的编译器嘛
其实,我用的是VC++6.0,哈哈



查看完整回答
反对 回复 2019-03-26
?
撒科打诨

TA贡献1934条经验 获得超2个赞

内联函数不是总能申请成功的 ,她也需要较大的开销,只是它存储于缓存中,少了一些去外存调用函数的时间,当函数调用次数不多时,几乎没有优势。

查看完整回答
反对 回复 2019-03-26
  • 3 回答
  • 0 关注
  • 2111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信