Snowdream
I'm awake but my world is half asleep
posts - 391, comments - 217, trackbacks - 0, articles - 7
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
原来GCC是支持尾递归的递推优化的
Posted on 2008-05-24 02:05
ZelluX
阅读(1083)
评论(0)
编辑
收藏
所属分类:
C/C++
水木上有人贴了个有趣的程序
#include
<
stdlib.h
>
#include
<
stdio.h
>
void
print_forever(
int
n)
{
printf(
"
%d\n
"
, n);
print_forever(n
+
1
);
}
int
main(
int
argc,
char
*
argv[])
{
print_forever(
0
);
return
0
;
}
用gcc -O2编译运行后会不停地打印从0开始的自然数,注意如果编译器没有做优化的话,打印到某个数的时候肯定会发生栈溢出从而程序终止的情况,但这个程序却能一直运行下去,说明编译器做了尾递归优化。
用gcc -O2 -S生成这个程序的汇编代码后证实了这一点。
.L6:
movl
%
ebx,
4
(
%
esp)
addl $
1
,
%
ebx
movl $.LC0, (
%
esp)
call printf
jmp .L6
print_forever的关键部分被优化成了一个n不断增加的死循环。
接下来是分析哪个优化选项处理了尾递归。
用O3 O2 O1三个优化强度编译程序,查看汇编代码后,发现尾递归优化是O2中新增的功能。于是查看O2新开启的优化开关:
gcc -c -Q -O1 --help=optimizers > /tmp/O1-opts
gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts
diff /tmp/O2-opts /tmp/O1-opts | grep enabled
输出结果:
<
-
falign
-
loops [enabled]
>
-
falign
-
jumps [enabled]
>
-
falign
-
labels [enabled]
>
-
fcaller
-
saves [enabled]
>
-
fcrossjumping [enabled]
>
-
fcse
-
follow
-
jumps [enabled]
>
-
fdelete
-
null
-
pointer
-
checks [enabled]
>
-
fexpensive
-
optimizations [enabled]
>
-
fforward
-
propagate [enabled]
>
-
fgcse [enabled]
>
-
finline
-
small
-
functions [enabled]
>
-
foptimize
-
register
-
move [enabled]
>
-
foptimize
-
sibling
-
calls [enabled]
>
-
fpeephole2 [enabled]
>
-
fregmove [enabled]
>
-
freorder
-
blocks [enabled]
>
-
freorder
-
functions [enabled]
>
-
fschedule
-
insns2 [enabled]
>
-
fstrict
-
aliasing [enabled]
>
-
fthread
-
jumps [enabled]
>
-
ftree
-
pre [enabled]
>
-
ftree
-
store
-
ccp [enabled]
>
-
ftree
-
vrp [enabled]
经证实是-foptimize-sibling-calls这个选项实现了尾递归的优化,具体内容可以参看
http://gcc.gnu.org./ml/gcc-patches/2000-03/msg00867.html
IT新闻
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关链接:
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
相关文章:
OS Lab 零散记录
ICS Lab 8 - 实现一个简单的代理服务器
ICS Lab 7 数据结构相关
MaNGOS阅读笔记 (1)
原来GCC是支持尾递归的递推优化的
C/C++中的序列点
Lab2
C++ 入门笔记 (8) - Object-Oriented Programming
memcpy函数代码分析
在未安装qt的windows系统中运行qt程序
Powered by:
BlogJava
Copyright © ZelluX
日历
<
2008年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
公告
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(9)
给我留言
查看公开留言
查看私人留言
随笔分类
(390)
Algorithm(57)
C/C++(40)
Courses(21)
Economics(2)
Laboratory(22)
Linux(46)
Mathematics(12)
OOP(87)
Scripting(19)
Security(3)
System(28)
Web(10)
书、电影、音乐(11)
其他(13)
点滴(19)
随笔档案
(379)
2008年10月 (3)
2008年9月 (1)
2008年7月 (2)
2008年6月 (6)
2008年5月 (13)
2008年4月 (19)
2008年3月 (8)
2008年2月 (33)
2008年1月 (19)
2007年12月 (10)
2007年11月 (14)
2007年10月 (24)
2007年9月 (18)
2007年8月 (28)
2007年7月 (33)
2007年6月 (26)
2007年5月 (30)
2007年4月 (92)
文章档案
(7)
2007年7月 (2)
2007年5月 (4)
2007年4月 (1)
相册
Illustration
15ers
jonathan的BLOG
Right There...
宙斯鱼的小鱼缸
小鲍的世界
简单幸福
逃遁的Persephone
阿缪尔的锦瑟
风之语的BLOG
友情链接
(04CS) ljh
(05CS) 小菜虎的窝
(06CS) FreePeter
(06SS) Overboming
(06SS) Sherry
(06SS) 十指飞扬
(06SS) 银色子弹
luohandsome的专栏
平淡是真——啃啃不老阁
收藏夹
[ADN.cn]Library
Debian学习笔记
Dictionary of Algorithms and Data Structures
Gollum
Lex&Yacc
Max On Java
techInterview Discussion
核桃仁
程序员面试题精选100题
铁手
搜索
积分与排名
积分 - 107265
排名 - 78
最新随笔
1. 32款最好的编程字体
2. 几个并行计算、内核相关的链接
3. OS Lab 零散记录
4. OSLab之中断处理
5. 郎咸平:从产业链分工看大学生就业困难
6. 上来bs下ctags 5.4
7. 2008.6.30 1:49
8. 2:0 WIN
9. ICS Lab 8 - 实现一个简单的代理服务器
10. ICS Lab 7 数据结构相关
最新评论
1. re: [zz]以空格代替Tab, 养成良好编码风格
@xiaomao101
这也太扯了。。
--ZelluX
2. re: [zz]以空格代替Tab, 养成良好编码风格
评论内容较长,点击标题查看
--xiaomao101
3. re: 郎咸平:从产业链分工看大学生就业困难
感触很深
--不iji
4. re: PKU1042 – Gone Fishing[未登录]
发一份测试数据给我,谢谢!
173125256@qq.com
--johnson
5. re: Windows - QQ、网页Flash视频无声音的解决方法
我试过那个字符串值存在,但问题还是上面的问题,解决不了。
原因是我用软件优化了系统。
如果你知道能告诉我下吗
Q419830255
--Q419830255
阅读排行榜
1. memcpy函数代码分析(2520)
2. 水源上看到的腾讯笔试题(2263)
3. [zz]vim+ctags+taglist插件安装使用(1867)
4. 《编程之美》上的一道题目的讨论(1832)
5. 最近读的两篇paper(1830)
评论排行榜
1. C# 学习笔记 (1)(14)
2. URAL 1011(10)
3. 《编程之美》上的一道题目的讨论(8)
4. Singleton模式与双检测锁定(DCL)(7)
5. 肆意一把(7)