新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 高效的C編程之:C循環(huán)結構

        高效的C編程之:C循環(huán)結構

        作者: 時間:2013-09-30 來源:網(wǎng)絡 收藏

        本文引用地址:http://www.104case.com/article/257020.htm

        14.5C

        循環(huán)體是程序設計與優(yōu)化的重點考慮對象。本節(jié)將著重講解在上處理循環(huán)最有效的方法。

        14.5.1

        首先來看下面的例子,兩個不同的循環(huán)退出條件,產(chǎn)生的不同匯編代碼。

        C源程序如下所示。

        intfact1(intn)

        {

        inti,fact=1;

        (i=1;i=n;i++)

        fact*=i;

        return(fact);

        }

        intfact2(intn)

        {

        inti,fact=1;

        (i=n;i!=0;i--)

        fact*=i;

        return(fact);

        }

        產(chǎn)生的匯編代碼如下所示。

        fact1

        MOVa3,#1

        MOVa2,#1

        CMPa1,#1

        BLT|L000020.J5.fact1|

        |L000010.J4.fact1|

        MULa3,a2,a3

        ADDa2,a2,#1

        CMPa2,a1

        BLE|L000010.J4.fact1|

        |L000020.J5.fact1|

        MOVa1,a3

        MOVpc,lr

        fact2

        MOVSa2,a1

        MOVa1,#1

        MOVEQpc,lr

        |L000034.J4.fact2|

        MULa1,a2,a1

        SUBSa2,a2,#1

        BNE|L000034.J4.fact2|

        MOVpc,lr

        從產(chǎn)生的匯編代碼中,可以看出兩個函數(shù)雖然實現(xiàn)的功能相同,但產(chǎn)生的代碼效率卻不盡相同。這里的關鍵是,循環(huán)的中止條件應為計數(shù)減到零(countdowntozero),而不是計數(shù)增加到某個值。由于減計數(shù)結果已存儲在條件標志里,與零比較的指令就可以省略。同時也可以少用一個寄存器來存儲值。

        注意

        上面的例子使用了-O2–Otime的編譯選項,如果使用-Ospace選項,編譯結果會有不同。

        對循環(huán)計數(shù)值i來說,如果i是無符號的,則循環(huán)繼續(xù)的條件既可以是i!=0,也可以是i>0。由于i不可能是負數(shù),所以這兩個條件是等價的。而對一個有符號的循環(huán)計數(shù)值來說,最好不要用條件i>0作為循環(huán)繼續(xù)執(zhí)行的條件。如果使用i>0作為循環(huán)繼續(xù)執(zhí)行的條件,編譯器將生成下面的代碼。

        SUBa2,a2,#1

        CMPr1,#0

        BGT|L000034.J4.fact2|

        這時,編譯器多增加了一條CMP指令,主要是為了防止有符號數(shù)i=−0x8000000。總之,無論對于有符號還是無符號的循環(huán)計數(shù)值,都應該使用i!=0作為循環(huán)的結束條件。對于有符號數(shù)i,這比使用i>0少了一條指令。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 固镇县| 土默特右旗| 定边县| 宣武区| 洛浦县| 明光市| 军事| 石棉县| 商洛市| 唐海县| 鲁山县| 舞钢市| 阜南县| 进贤县| 洪泽县| 怀来县| 城固县| 叙永县| 平阳县| 英吉沙县| 东乡县| 屯门区| 梨树县| 彩票| 潮安县| 海门市| 铜山县| 永和县| 慈溪市| 柘荣县| 米林县| 内黄县| 花莲市| 江川县| 上饶市| 北海市| 温宿县| 黄骅市| 汤原县| 静安区| 建平县|