社区
C语言
帖子详情
关于递归函数的内联
ftkghost
2007-04-02 08:18:54
请问递归的函数编译器给内联吗?内联以后代码扩展?怎样测试它是否被内联了?麻烦各位老大给小弟大致讲讲,谢谢。
...全文
757
18
打赏
收藏
关于递归函数的内联
请问递归的函数编译器给内联吗?内联以后代码扩展?怎样测试它是否被内联了?麻烦各位老大给小弟大致讲讲,谢谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hubo520891
2012-04-23
打赏
举报
回复
一目了然
ftkghost
2007-04-04
打赏
举报
回复
谢谢
ftkghost
2007-04-03
打赏
举报
回复
to steedhorse(晨星)
我在调用递归函数后看了一下汇编代码,即使确定了很少的递归嵌套层数也没有展开代码。
很简单的一个函数,我在main里面调用fun(3),汇编代码还是通过call调用函数
__forceinline int fun(int n)
{
int sum = 0;
if(n>0)
sum = n+fun(n-1);
return sum;
}
ftkghost
2007-04-03
打赏
举报
回复
学到了 谢谢各位大牛~
Arthur_
2007-04-03
打赏
举报
回复
會溢出
北极猩猩
2007-04-03
打赏
举报
回复
编译器在察觉到递归的时候会自动取消内联的。
不仅是递归,在函数体中包含循环和switch的时候,大多数编译器都回取消内联。甚至当函数中有效代码行超多一定数量的时候也有可能取消内联。
inline关键只是告诉编译器我想内联,至于他给不给你办事你就不知道了,呵呵。
www_adintr_com
2007-04-03
打赏
举报
回复
递归都可以化为循环,转化之后就可以内联了,但是代码结构可能全都变了,调试的时候就郁闷了。
thinkinnight
2007-04-03
打赏
举报
回复
应该是不会内联,inline一般都是短小的效率高的程序
晨星
2007-04-03
打赏
举报
回复
//谢谢啊~~不过为什么呢?是因为无法无限的扩展?
================================================
递归的深度及回溯的情形往往到运行时才能知道。
相反,如果递归和回溯的整个过程都可以在编译时确定,而且递归的深度也不是特别深(比如说,不超过20层),那么你是可以考虚通过模板元编程来实现。
hailongchang
2007-04-03
打赏
举报
回复
递归函数一般是用堆栈实现的,也就是指令级别的实现,内联只是在源代码级别实现
所以估计强制内联应该会无效的。
晨星
2007-04-03
打赏
举报
回复
还有,看汇编码有时也不完全说明问题的,因为你通常没有很多精力去看每一种编译器的汇编码,你看的那种只能说它那种编译器优化的程度到此而已,不能说明其它所有编译器以及未来可能出现的C++编译器。
当然,我不是特指这个问题,在这个具体的问题上,我也认为递归函数一般不会被内联。所以需要时宁愿用模板元编程实现。
我只是说一个具体的编译器,在一堆具体的编译选项下的结果只能用来“佐证”,不能用来“证明”。
晨星
2007-04-03
打赏
举报
回复
我没说递归层数少就可能会内联。
而是说:如果在编译时可以确定递归层数和递归情况的话,你完全可以放弃使用递归函数,而改用递归的模板元编程来解决你的问题。——你既然决定不用它了,它是不是内联也就跟你没关系了。
——这完全不是一个意思嘛,呵呵。
ftkghost
2007-04-02
打赏
举报
回复
用__forinline也不报错,强制内联也无效?
ftkghost
2007-04-02
打赏
举报
回复
谢谢啊~~不过为什么呢?是因为无法无限的扩展?
cccbuiler
2007-04-02
打赏
举报
回复
一般标记为内联的函数,在编译时,编译器还会判断一下函数的复杂度。
像递归这样的函数,虽然标记为内联了,但是,由于函数比较复杂,编译器也不会将其它编译为内联函数的。
hslinux
2007-04-02
打赏
举报
回复
递归一般不会内联,那什么时候可能会内联?星星大哥解释下让俺们长长见识先。.@_@
珍惜生命远离CPP
2007-04-02
打赏
举报
回复
呃一般不会,
晨星
2007-04-02
打赏
举报
回复
递归一般不会内联。
4_
递归函数
和
内联
函数.tif
4_
递归函数
和
内联
函数.tif
JS中
递归函数
编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为
递归函数
。
递归函数
不能定义为
内联
函数。
递归函数
: function factorical(num){ if(num<=1){ return 1; } else{ return num*factorical(num-1); } } factorial(2)//2 这个
递归函数
就是用函数来调用函数本身,但是这样真的好吗,好 接下来看这里 var another=factorical; factorical=null; console.log(another(2))//会报错说
《c语言深度解析》第3、4章 存储类、生命周期、作用域、链接域,指针与函数
课程内容:第3章:存储类与auto、static、register关键字指令、常量、变量的生命周期变量与函数的作用域链接域与extern、static关键字声明的意义第4章:存储空间、符号、地址一级指针与多级指针野指针与段错误void *指针类型const与指针函数指针 函数调用—栈的使用过程回调函数和函数指针数组指针与函数传参
递归函数
内联
函数
c语言教程 函数
了解函数的概念 掌握函数参数的传递方式 掌握函数的分类 掌握指针函数和函数指针 了解
内联
函数和
递归函数
c++ 用递归求n的阶乘
用c++用递归求n的阶乘,你的值由用户输入,输入不正确有错误提示对话框
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章