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

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

    怎么跟你的不一樣?
    主站蜘蛛池模板: 久久高潮一级毛片免费| 96免费精品视频在线观看| 国产精品午夜免费观看网站| 最近中文字幕国语免费完整 | 2048亚洲精品国产| 免费的黄网站男人的天堂| 日日AV拍夜夜添久久免费| 亚洲精品无码永久在线观看男男 | 国产免费观看a大片的网站| 亚洲日韩AV一区二区三区四区 | 亚洲黄色在线网站| 日本免费人成视频在线观看| 亚洲综合婷婷久久| 91精品全国免费观看含羞草| 亚洲第一页在线播放| 免费无码精品黄AV电影| 亚洲日韩精品无码专区加勒比| 最近2019中文字幕免费看最新 | 日本免费网址大全在线观看| 亚洲一区中文字幕在线观看| 大香人蕉免费视频75| 黄床大片30分钟免费看| 久久亚洲色一区二区三区| 嫩草成人永久免费观看| 亚洲午夜电影在线观看| 真实乱视频国产免费观看| 黄色免费在线网址| 久久精品国产69国产精品亚洲| 95免费观看体验区视频| 亚洲Av高清一区二区三区| 国产18禁黄网站免费观看| 中文字幕在线视频免费| 亚洲精品电影天堂网| 永久久久免费浮力影院| 国产免费一区二区三区免费视频| 亚洲成人中文字幕| 妞干网免费视频观看| 国产精品视频全国免费观看| 亚洲人成电影网站| 亚洲日本在线观看视频| 3344永久在线观看视频免费首页|