社区
C语言
帖子详情
关于递归函数的内联
ftkghost
2007-04-02 08:18:54
请问递归的函数编译器给内联吗?内联以后代码扩展?怎样测试它是否被内联了?麻烦各位老大给小弟大致讲讲,谢谢。
...全文
813
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
《C语言函数进阶:解锁递归与
内联
的神秘力量》
内容概要:本文深入讲解C语言中函数的进阶应用,重点围绕递归与
内联
函数两大核心技术展开。详细介绍了
递归函数
的优化方法,包括尾递归和记忆化递归,并通过阶乘和斐波那契数列的实例展示如何避免栈溢出和重复计算问题。同时系统阐述了
内联
函数的定义、作用及其与宏定义的本质区别,强调其在减少函数调用开销、提升执行效率方面的优势。文章还结合位运算、性能测试等实战案例,对比分析递归与循环的效率差异,帮助读者掌握在不同场景下选择最优实现方式的能力。 适合人群:具备C语言基础语法知识,熟悉函数、指针和基本数据结构,有一定编程经验的初、中级开发者,尤其适合希望深入理解程序性能优化机制的学习者。 使用场景及目标:①掌握尾递归和记忆化递归的实现原理与应用场景,解决传统递归带来的性能瓶颈;②理解
内联
函数的工作机制,学会在高频调用的小函数中使用inline提升效率;③通过对比递归与循环的时间/空间复杂度,做出更合理的算法设计决策。 阅读建议:建议结合文中代码示例动手实践,使用计时函数进行性能对比测试,深入体会不同优化手段的实际效果。注意理解编译器对
内联
函数的处理机制以及递归调用栈的变化过程,建议配合调试工具观察程序运行细节,以强化对底层执行逻辑的认知。
内联
函数.cpp
翁恺教授视频《C++面向对象程序设计》源码
VC中
内联
函数的定义和案例共3页.pdf.zip
VC中
内联
函数的定义和案例共3页.pdf.zip
数学软件PPT学习教案.pptx
数学软件PPT学习教案.pptx
C语言
70,035
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章