Snowdream
posts - 403, comments - 310, trackbacks - 0, articles - 7
BlogJava
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
原來GCC是支持尾遞歸的遞推優化的
Posted on 2008-05-24 02:05
ZelluX
閱讀(2453)
評論(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題
鐵手
搜索
積分與排名
積分 - 338669
排名 - 166
最新隨筆
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插件安裝使用(18317)
2.?memcpy函數代碼分析(9395)
3.?[zz]Zotero與Endnote的互相導入(8789)
4.?BNF 文法 (1) - 語法樹 | 二義性的解決(8282)
5.?Java泛型中的? super T語法(6568)
評論排行榜
1.?C# 學習筆記 (1)(14)
2.?Windows - QQ、網頁Flash視頻無聲音的解決方法(14)
3.?URAL 1011(10)
4.?《編程之美》上的一道題目的討論(8)
5.?Singleton模式與雙檢測鎖定(DCL)(7)
主站蜘蛛池模板:
久久高潮一级毛片免费
|
96免费精品视频在线观看
|
国产精品午夜免费观看网站
|
最近中文字幕国语免费完整
|
2048亚洲精品国产
|
免费的黄网站男人的天堂
|
日日AV拍夜夜添久久免费
|
亚洲精品无码永久在线观看男男
|
国产免费观看a大片的网站
|
亚洲日韩AV一区二区三区四区
|
亚洲黄色在线网站
|
日本免费人成视频在线观看
|
亚洲综合婷婷久久
|
91精品全国免费观看含羞草
|
亚洲第一页在线播放
|
免费无码精品黄AV电影
|
亚洲日韩精品无码专区加勒比
|
最近2019中文字幕免费看最新
|
日本免费网址大全在线观看
|
亚洲一区中文字幕在线观看
|
大香人蕉免费视频75
|
黄床大片30分钟免费看
|
久久亚洲色一区二区三区
|
嫩草成人永久免费观看
|
亚洲午夜电影在线观看
|
真实乱视频国产免费观看
|
黄色免费在线网址
|
久久精品国产69国产精品亚洲
|
95免费观看体验区视频
|
亚洲Av高清一区二区三区
|
国产18禁黄网站免费观看
|
中文字幕在线视频免费
|
亚洲精品电影天堂网
|
永久久久免费浮力影院
|
国产免费一区二区三区免费视频
|
亚洲成人中文字幕
|
妞干网免费视频观看
|
国产精品视频全国免费观看
|
亚洲人成电影网站
|
亚洲日本在线观看视频
|
3344永久在线观看视频免费首页
|