免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: sagasw
打印 上一主题 下一主题

[C] 递归实验-C语言递归调用的极限 [复制链接]

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
11 [报告]
发表于 2010-12-22 09:25 |只看该作者
回复 9# OwnWaterloo


    以前也看过尾递归,不过都停留在实现形式上面了,这个估计也得看编译器吧,thx

论坛徽章:
0
12 [报告]
发表于 2010-12-22 10:27 |只看该作者
回复 7# OwnWaterloo


    额,用gcc 开O3后,确实被优化为死循环了,,

论坛徽章:
0
13 [报告]
发表于 2010-12-22 11:38 |只看该作者
  1. #include <stdio.h>

  2. int count = 0;

  3. void fun()
  4. {
  5.         printf("count = %d\n", ++count);
  6.         fun();
  7. }

  8. int main()
  9. {
  10.         fun();
  11.         return 0;
  12. }
复制代码
ubuntu10.10   gcc4.4.5  不开优化
fun()大约会被递归调用327400次,每次运行这个程序fun的调用次数会有几十次的浮动

编译成的主要汇编码为
  1. fun:
  2.         pushl        %ebp
  3.         movl        %esp, %ebp
  4.         subl                $24, %esp                     这句可以看到   每次调用fun()都会给它紧挨着上次的栈继续分配24字节的栈空间,再加上上次调用的返回地址和%ebp入栈                                      
  5.                                                                 占了8个字节   所以每次调用都会使用32字节的栈空间
  6.         movl        count, %eax
  7.         addl                $1, %eax
  8.         movl        %eax, count
  9.         movl        count, %edx
  10.         movl        $.LC0, %eax
  11.         movl        %edx, 4(%esp)
  12.         movl        %eax, (%esp)
  13.         call        printf
  14.         call        fun
复制代码
调用327400次,每次分配32字节栈空间,总共就是327400*32 = 1046400字节,换算过去就是10231M啊    这也太大了吧

求高人解释!

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
14 [报告]
发表于 2010-12-22 11:41 |只看该作者
gcc4.4.5  不开优化
sunboxinan 发表于 2010-12-22 11:38


不开优化……
不优化……
优化……
……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
15 [报告]
发表于 2010-12-22 11:47 |只看该作者
回复 13# sunboxinan

哦, 我懂你的意思了。
重点不是尾递归, 而是为什么栈看上去这么大是吧?

是因为单位换算错了……
MB 是百万字节……
除1024的结果的单位是 KB……

论坛徽章:
0
16 [报告]
发表于 2010-12-22 13:21 |只看该作者
回复 15# OwnWaterloo


    汗。。。。。确实。。。 单位错了      
换算成兆  大约是10M    这就比较合理了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP