<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 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    原來(lái)GCC是支持尾遞歸的遞推優(yōu)化的

    Posted on 2008-05-24 02:05 ZelluX 閱讀(2445) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): 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)化的話(huà),打印到某個(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é)果:

    經(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

    怎么跟你的不一樣?
    主站蜘蛛池模板: 亚洲人成图片网站| 特级做A爰片毛片免费69| 国产亚洲精品AAAA片APP| 亚洲成色www久久网站夜月| 国产男女猛烈无遮档免费视频网站 | 最近的2019免费中文字幕| 亚洲国产精品日韩av不卡在线| 亚洲AV无码一区二区二三区软件| 又黄又爽的视频免费看| 国产v精品成人免费视频400条| 精品国产麻豆免费人成网站| 无遮挡国产高潮视频免费观看| 亚洲欧洲专线一区| 亚洲影视自拍揄拍愉拍| 久久久婷婷五月亚洲97号色| 久久亚洲综合色一区二区三区 | 国产AV旡码专区亚洲AV苍井空| 亚洲伦另类中文字幕| 8x成人永久免费视频| 国产综合免费精品久久久| 黄色网址大全免费| 老色鬼久久亚洲AV综合| 亚洲精品国精品久久99热一| 4338×亚洲全国最大色成网站| 国产大片免费观看中文字幕| 在线免费观看一级片| 亚洲免费综合色在线视频| 美女视频黄的全免费视频| 日韩在线观看视频免费| 污视频网站免费在线观看| 国产亚洲视频在线播放大全| 精品亚洲福利一区二区| 亚洲AV无码一区二区大桥未久| 亚洲成a人片在线观看中文动漫| 亚洲熟妇无码另类久久久| 亚洲日韩精品一区二区三区无码 | 高潮毛片无遮挡高清免费| 在线播放国产不卡免费视频| 永久免费无码日韩视频| 国产福利在线观看永久免费| 搡女人免费免费视频观看|