<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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
    輸出結果:

    經證實是-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

    怎么跟你的不一樣?
    主站蜘蛛池模板: 亚洲一区二区三区久久| 亚洲一区在线观看视频| 曰批免费视频播放在线看片二| 九九精品免费视频| 亚洲毛片免费观看| 97性无码区免费| 国产亚洲sss在线播放| 无码免费午夜福利片在线| 国产精品亚洲自在线播放页码| www视频免费看| 亚洲精品GV天堂无码男同| 免费黄色大片网站| 特级毛片A级毛片100免费播放| 无码欧精品亚洲日韩一区夜夜嗨 | 久久精品国产免费观看三人同眠| 亚洲av不卡一区二区三区| 99久久免费精品高清特色大片| 亚洲精品国产专区91在线| 无码日韩人妻av一区免费| 亚洲色欲啪啪久久WWW综合网| 日韩视频免费在线| 一级人做人a爰免费视频| 亚洲av午夜福利精品一区人妖| 久久久久高潮毛片免费全部播放 | 大胆亚洲人体视频| 野花香在线视频免费观看大全| 久久精品国产亚洲av水果派| 9久9久女女免费精品视频在线观看| 亚洲乱亚洲乱妇24p| 亚洲另类激情专区小说图片| 久久成人免费电影| 亚洲精品无码不卡在线播放| 久久亚洲国产成人精品无码区| 久久免费国产精品一区二区| 国产色在线|亚洲| 久久久久亚洲精品天堂久久久久久 | 中文字幕亚洲精品资源网| 天天操夜夜操免费视频| 精选影视免费在线 | 亚洲香蕉久久一区二区| 国产午夜亚洲精品理论片不卡|