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
閱讀(2445)
評(píng)論(1)
編輯
收藏
所屬分類(lèi):
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)化的話(huà),打印到某個(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
怎么跟你的不一樣?
新用戶(hù)注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶(hù)
登錄
后才能發(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++ 入門(mén)筆記 (8) - Object-Oriented Programming
memcpy函數(shù)代碼分析
在未安裝qt的windows系統(tǒng)中運(yùn)行qt程序
C++ 入門(mén)筆記 (7)
Powered by:
BlogJava
Copyright © ZelluX
日歷
<
2013年9月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
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
1
2
3
4
5
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(21)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類(lè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的專(zhuān)欄
平淡是真——啃啃不老閣
收藏夾
[ADN.cn]Library
Debian學(xué)習(xí)筆記
Dictionary of Algorithms and Data Structures
Gollum
Lex&Yacc
Max On Java
techInterview Discussion
核桃仁
程序員面試題精選100題
鐵手
搜索
積分與排名
積分 - 336629
排名 - 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ù)代碼分析(9385)
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)
主站蜘蛛池模板:
亚洲人成图片网站
|
特级做A爰片毛片免费69
|
国产亚洲精品AAAA片APP
|
亚洲成色www久久网站夜月
|
国产男女猛烈无遮档免费视频网站
|
最近的2019免费中文字幕
|
亚洲国产精品日韩av不卡在线
|
亚洲AV无码一区二区二三区软件
|
又黄又爽的视频免费看
|
国产v精品成人免费视频400条
|
精品国产麻豆免费人成网站
|
无遮挡国产高潮视频免费观看
|
亚洲欧洲专线一区
|
亚洲影视自拍揄拍愉拍
|
久久久婷婷五月亚洲97号色
|
久久亚洲综合色一区二区三区
|
国产AV旡码专区亚洲AV苍井空
|
亚洲伦另类中文字幕
|
8x成人永久免费视频
|
国产综合免费精品久久久
|
黄色网址大全免费
|
老色鬼久久亚洲AV综合
|
亚洲精品国精品久久99热一
|
4338×亚洲全国最大色成网站
|
国产大片免费观看中文字幕
|
在线免费观看一级片
|
亚洲免费综合色在线视频
|
美女视频黄的全免费视频
|
日韩在线观看视频免费
|
污视频网站免费在线观看
|
国产亚洲视频在线播放大全
|
精品亚洲福利一区二区
|
亚洲AV无码一区二区大桥未久
|
亚洲成a人片在线观看中文动漫
|
亚洲熟妇无码另类久久久
|
亚洲日韩精品一区二区三区无码
|
高潮毛片无遮挡高清免费
|
在线播放国产不卡免费视频
|
永久免费无码日韩视频
|
国产福利在线观看永久免费
|
搡女人免费免费视频观看
|