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

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


慕斯王
浏览 2114回答 3
3回答

ibeautiful

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

大话西游666

#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,哈哈

撒科打诨

内联函数不是总能申请成功的 ,她也需要较大的开销,只是它存储于缓存中,少了一些去外存调用函数的时间,当函数调用次数不多时,几乎没有优势。
打开App,查看更多内容
随时随地看视频慕课网APP