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)
主站蜘蛛池模板:
亚洲无成人网77777
|
亚洲情XO亚洲色XO无码
|
亚洲一区二区三区高清不卡
|
亚洲国产AV无码专区亚洲AV
|
一级毛片免费在线观看网站
|
亚洲精品无码激情AV
|
亚洲人成人77777在线播放
|
香港经典a毛片免费观看看
|
最近免费中文字幕大全高清大全1 最近免费中文字幕mv在线电影
|
亚洲日本国产综合高清
|
二个人看的www免费视频
|
亚洲午夜福利717
|
午夜不卡久久精品无码免费
|
亚洲自偷精品视频自拍
|
国产1024精品视频专区免费
|
精品亚洲一区二区
|
蜜桃成人无码区免费视频网站
|
亚洲免费一区二区
|
免费无码作爱视频
|
亚洲色图综合网站
|
免费看的黄色大片
|
一级毛片在线完整免费观看
|
久久精品国产亚洲网站
|
无码区日韩特区永久免费系列
|
亚洲午夜成人精品无码色欲
|
免费在线精品视频
|
国内少妇偷人精品视频免费
|
亚洲国产美女精品久久久久
|
日本免费一区二区三区最新vr
|
国产成人精品免费视频大全
|
亚洲乱码无码永久不卡在线
|
最近最好的中文字幕2019免费
|
亚洲a∨无码精品色午夜
|
男女免费观看在线爽爽爽视频
|
亚洲人xxx日本人18
|
亚洲一本大道无码av天堂
|
久9这里精品免费视频
|
亚洲va久久久久
|
亚洲色婷婷六月亚洲婷婷6月
|
1000部禁片黄的免费看
|
视频一区在线免费观看
|