Snowdream
posts - 403, comments - 310, trackbacks - 0, articles - 7
BlogJava
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
原來GCC是支持尾遞歸的遞推優化的
Posted on 2008-05-24 02:05
ZelluX
閱讀(2444)
評論(1)
編輯
收藏
所屬分類:
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
評論
#
re: 原來GCC是支持尾遞歸的遞推優化的
回復
更多評論
2013-09-02 22:37 by
darkhorse
我在ubuntu下面匯編的結果是:
print_forever:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $20, %esp
movl 8(%ebp), %ebx
.p2align 4,,7
.p2align 3
怎么跟你的不一樣?
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
內存模型相關的資料
OS Lab 零散記錄
MaNGOS閱讀筆記 (1)
原來GCC是支持尾遞歸的遞推優化的
C/C++中的序列點
Lab2
C++ 入門筆記 (8) - Object-Oriented Programming
memcpy函數代碼分析
在未安裝qt的windows系統中運行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
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(21)
給我留言
查看公開留言
查看私人留言
隨筆分類
(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)
書、電影、音樂(11)
其他(14)
點滴(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)
相冊
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題
鐵手
搜索
積分與排名
積分 - 336587
排名 - 167
最新隨筆
1.?新博客
2.?慎用xen的make world...
3.?內存模型相關的資料
4.?安全方面的經典論文:A Logic of Authentication
5.?Lock-Free 算法的幾個鏈接
6.?10 Papers Every Programmer Should Read
7.?PieTTY中按Ctrl+S導致掛起的問題解決
8.?Finding and Reproducing Heisenbugs in Concurrent Programs
9.?Ubuntu 8.10 瀏覽網頁不穩定的解決方法
10.?[zz]蘇南經濟模式興衰親歷記
最新評論
1.?re: C/C++中的序列點
說的太好了,解決我長久的困擾!
--除美滅日平韓
2.?re: 原來GCC是支持尾遞歸的遞推優化的
評論內容較長,點擊標題查看
--darkhorse
3.?re: Arch下配置samba服務
我按照你的方法,安裝了SAMBA,但是 /etc/rc.d/samba start 啟動不了samba服務。提示不存在這個文件或目錄的,怎么辦?
--zhangbear
4.?re: [zz]LKM Rootkits on Linux x86 v2.6
rhel 5 系列 安裝了 Xen 內核, 怎么rootkit xen kernel 呢?
--消息
5.?re: CLRS 習題 16.2-6 部分背包問題的O(n)算法
@ynnej
T(n)=2T(n/2)+O(n) 才是 nlgn 注意其中有一個2
--荒廢庭院
閱讀排行榜
1.?[zz]vim+ctags+taglist插件安裝使用(18313)
2.?memcpy函數代碼分析(9385)
3.?[zz]Zotero與Endnote的互相導入(8777)
4.?BNF 文法 (1) - 語法樹 | 二義性的解決(8261)
5.?Java泛型中的? super T語法(6560)
評論排行榜
1.?C# 學習筆記 (1)(14)
2.?Windows - QQ、網頁Flash視頻無聲音的解決方法(14)
3.?URAL 1011(10)
4.?《編程之美》上的一道題目的討論(8)
5.?Singleton模式與雙檢測鎖定(DCL)(7)
主站蜘蛛池模板:
亚洲一区二区三区久久
|
亚洲一区在线观看视频
|
曰批免费视频播放在线看片二
|
九九精品免费视频
|
亚洲毛片免费观看
|
97性无码区免费
|
国产亚洲sss在线播放
|
无码免费午夜福利片在线
|
国产精品亚洲自在线播放页码
|
www视频免费看
|
亚洲精品GV天堂无码男同
|
免费黄色大片网站
|
特级毛片A级毛片100免费播放
|
无码欧精品亚洲日韩一区夜夜嗨
|
久久精品国产免费观看三人同眠
|
亚洲av不卡一区二区三区
|
99久久免费精品高清特色大片
|
亚洲精品国产专区91在线
|
无码日韩人妻av一区免费
|
亚洲色欲啪啪久久WWW综合网
|
日韩视频免费在线
|
一级人做人a爰免费视频
|
亚洲av午夜福利精品一区人妖
|
久久久久高潮毛片免费全部播放
|
大胆亚洲人体视频
|
野花香在线视频免费观看大全
|
久久精品国产亚洲av水果派
|
9久9久女女免费精品视频在线观看
|
亚洲乱亚洲乱妇24p
|
亚洲另类激情专区小说图片
|
久久成人免费电影
|
亚洲精品无码不卡在线播放
|
久久亚洲国产成人精品无码区
|
久久免费国产精品一区二区
|
国产色在线|亚洲
|
久久久久亚洲精品天堂久久久久久
|
中文字幕亚洲精品资源网
|
天天操夜夜操免费视频
|
精选影视免费在线
|
亚洲香蕉久久一区二区
|
国产午夜亚洲精品理论片不卡
|