递归函数若是内联(inline)函数,是否就不需要函数调用时的大开销了?
3 回答
ibeautiful
TA贡献1993条经验 获得超5个赞
递归是内联的话,编译器如何编译?
递归的处理方法是讲函数调用层层入栈,通过出栈来调用每层的函数;
如果写成内联,编译器编译时都搞不清楚了吧,更别谈调用了。
大话西游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,哈哈
- 3 回答
- 0 关注
- 2222 浏览
添加回答
举报
0/150
提交
取消