Snowdream
posts - 403, comments - 310, trackbacks - 0, articles - 7
BlogJava
::
首頁(yè)
::
新隨筆
::
聯(lián)系
::
聚合
::
管理
原來(lái)GCC是支持尾遞歸的遞推優(yōu)化的
Posted on 2008-05-24 02:05
ZelluX
閱讀(2444)
評(píng)論(1)
編輯
收藏
所屬分類:
C/C++
水木上有人貼了個(gè)有趣的程序
#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編譯運(yùn)行后會(huì)不停地打印從0開(kāi)始的自然數(shù),注意如果編譯器沒(méi)有做優(yōu)化的話,打印到某個(gè)數(shù)的時(shí)候肯定會(huì)發(fā)生棧溢出從而程序終止的情況,但這個(gè)程序卻能一直運(yùn)行下去,說(shuō)明編譯器做了尾遞歸優(yōu)化。
用gcc -O2 -S生成這個(gè)程序的匯編代碼后證實(shí)了這一點(diǎn)。
.L6:
????????movl????
%
ebx,?
4
(
%
esp)
????????addl????$
1
,?
%
ebx
????????movl????$.LC0,?(
%
esp)
????????call????printf
????????jmp?????.L6
print_forever的關(guān)鍵部分被優(yōu)化成了一個(gè)n不斷增加的死循環(huán)。
接下來(lái)是分析哪個(gè)優(yōu)化選項(xiàng)處理了尾遞歸。
用O3 O2 O1三個(gè)優(yōu)化強(qiáng)度編譯程序,查看匯編代碼后,發(fā)現(xiàn)尾遞歸優(yōu)化是O2中新增的功能。于是查看O2新開(kāi)啟的優(yōu)化開(kāi)關(guān):
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
輸出結(jié)果:
<
???
-
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]
經(jīng)證實(shí)是-foptimize-sibling-calls這個(gè)選項(xiàng)實(shí)現(xiàn)了尾遞歸的優(yōu)化,具體內(nèi)容可以參看
http://gcc.gnu.org./ml/gcc-patches/2000-03/msg00867.html
評(píng)論
#
re: 原來(lái)GCC是支持尾遞歸的遞推優(yōu)化的
回復(fù)
更多評(píng)論
2013-09-02 22:37 by
darkhorse
我在ubuntu下面匯編的結(jié)果是:
print_forever:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $20, %esp
movl 8(%ebp), %ebx
.p2align 4,,7
.p2align 3
怎么跟你的不一樣?
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
相關(guān)文章:
內(nèi)存模型相關(guān)的資料
OS Lab 零散記錄
MaNGOS閱讀筆記 (1)
原來(lái)GCC是支持尾遞歸的遞推優(yōu)化的
C/C++中的序列點(diǎn)
Lab2
C++ 入門筆記 (8) - Object-Oriented Programming
memcpy函數(shù)代碼分析
在未安裝qt的windows系統(tǒng)中運(yùn)行qt程序
C++ 入門筆記 (7)
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
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(21)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類
(390)
Algorithm(57)
C/C++(39)
Courses(15)
Economics(2)
Laboratory(25)
Linux(47)
Mathematics(12)
OOP(89)
Scripting(19)
Security(3)
System(28)
Web(10)
書(shū)、電影、音樂(lè)(11)
其他(14)
點(diǎn)滴(19)
隨筆檔案
(389)
2009年12月 (1)
2009年4月 (1)
2009年3月 (4)
2009年2月 (2)
2009年1月 (2)
2008年11月 (1)
2008年10月 (9)
2008年9月 (1)
2008年7月 (2)
2008年6月 (4)
2008年5月 (12)
2008年4月 (18)
2008年3月 (7)
2008年2月 (33)
2008年1月 (19)
2007年12月 (8)
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)
相冊(cè)
Illustration
15ers
jonathan的BLOG
Right There...
宙斯魚(yú)的小魚(yú)缸
小鮑的世界
簡(jiǎn)單幸福
逃遁的Persephone
阿繆爾的錦瑟
風(fēng)之語(yǔ)的BLOG
友情鏈接
(04CS) ljh
(05CS) 小菜虎的窩
(06CS) FreePeter
(06SS) Overboming
(06SS) Sherry
(06SS) 十指飛揚(yáng)
(06SS) 銀色子彈
luohandsome的專欄
平淡是真——啃啃不老閣
收藏夾
[ADN.cn]Library
Debian學(xué)習(xí)筆記
Dictionary of Algorithms and Data Structures
Gollum
Lex&Yacc
Max On Java
techInterview Discussion
核桃仁
程序員面試題精選100題
鐵手
搜索
積分與排名
積分 - 336586
排名 - 167
最新隨筆
1.?新博客
2.?慎用xen的make world...
3.?內(nèi)存模型相關(guān)的資料
4.?安全方面的經(jīng)典論文:A Logic of Authentication
5.?Lock-Free 算法的幾個(gè)鏈接
6.?10 Papers Every Programmer Should Read
7.?PieTTY中按Ctrl+S導(dǎo)致掛起的問(wèn)題解決
8.?Finding and Reproducing Heisenbugs in Concurrent Programs
9.?Ubuntu 8.10 瀏覽網(wǎng)頁(yè)不穩(wěn)定的解決方法
10.?[zz]蘇南經(jīng)濟(jì)模式興衰親歷記
最新評(píng)論
1.?re: C/C++中的序列點(diǎn)
說(shuō)的太好了,解決我長(zhǎng)久的困擾!
--除美滅日平韓
2.?re: 原來(lái)GCC是支持尾遞歸的遞推優(yōu)化的
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--darkhorse
3.?re: Arch下配置samba服務(wù)
我按照你的方法,安裝了SAMBA,但是 /etc/rc.d/samba start 啟動(dòng)不了samba服務(wù)。提示不存在這個(gè)文件或目錄的,怎么辦?
--zhangbear
4.?re: [zz]LKM Rootkits on Linux x86 v2.6
rhel 5 系列 安裝了 Xen 內(nèi)核, 怎么rootkit xen kernel 呢?
--消息
5.?re: CLRS 習(xí)題 16.2-6 部分背包問(wèn)題的O(n)算法
@ynnej
T(n)=2T(n/2)+O(n) 才是 nlgn 注意其中有一個(gè)2
--荒廢庭院
閱讀排行榜
1.?[zz]vim+ctags+taglist插件安裝使用(18313)
2.?memcpy函數(shù)代碼分析(9384)
3.?[zz]Zotero與Endnote的互相導(dǎo)入(8777)
4.?BNF 文法 (1) - 語(yǔ)法樹(shù) | 二義性的解決(8261)
5.?Java泛型中的? super T語(yǔ)法(6560)
評(píng)論排行榜
1.?C# 學(xué)習(xí)筆記 (1)(14)
2.?Windows - QQ、網(wǎng)頁(yè)Flash視頻無(wú)聲音的解決方法(14)
3.?URAL 1011(10)
4.?《編程之美》上的一道題目的討論(8)
5.?Singleton模式與雙檢測(cè)鎖定(DCL)(7)
主站蜘蛛池模板:
国产一区二区三区免费观看在线
|
亚洲AV第一页国产精品
|
亚洲免费人成视频观看
|
亚洲一区二区三区深夜天堂
|
99热这里只有精品6免费
|
毛片a级毛片免费观看免下载
|
一级毛片a免费播放王色
|
青青草无码免费一二三区
|
免费特级黄毛片在线成人观看
|
亚洲国产成人精品无码一区二区
|
久久www免费人成看片
|
亚洲国产精品成人久久久
|
四虎永久在线精品免费观看视频
|
亚洲三级在线视频
|
成年美女黄网站色大免费视频
|
亚洲欧美日韩中文字幕一区二区三区
|
亚洲精品动漫免费二区
|
亚洲AV无码一区二区三区网址
|
国产成人免费片在线观看
|
亚洲神级电影国语版
|
一个人看的在线免费视频
|
久久精品国产亚洲AV不卡
|
亚洲成_人网站图片
|
日本免费久久久久久久网站
|
久久国产亚洲精品无码
|
无人在线观看完整免费版视频
|
在线aⅴ亚洲中文字幕
|
国产大片线上免费看
|
大妹子影视剧在线观看全集免费
|
亚洲av女电影网
|
最近中文字幕无免费视频
|
特级aaaaaaaaa毛片免费视频
|
亚洲精品色午夜无码专区日韩
|
最近中文字幕国语免费完整
|
久久不见久久见中文字幕免费
|
亚洲AV无码久久精品色欲
|
老汉精品免费AV在线播放
|
久久综合久久综合亚洲
|
免费v片在线观看无遮挡
|
久久综合九色综合97免费下载
|
亚洲熟妇av一区二区三区
|