新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 高效的C編程之:C循環結構

        高效的C編程之:C循環結構

        作者: 時間:2013-09-30 來源:網絡 收藏

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

        14.5C

        循環體是程序設計與優化的重點考慮對象。本節將著重講解在上處理循環最有效的方法。

        14.5.1

        首先來看下面的例子,兩個不同的循環退出條件,產生的不同匯編代碼。

        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);

        }

        產生的匯編代碼如下所示。

        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

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

        注意

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

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

        SUBa2,a2,#1

        CMPr1,#0

        BGT|L000034.J4.fact2|

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


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 深泽县| 平遥县| 汕头市| 五大连池市| 祁连县| 四会市| 龙海市| 武汉市| 全州县| 岑巩县| 四川省| 夹江县| 德惠市| 九台市| 客服| 阿拉尔市| 吉木萨尔县| 临汾市| 阿拉善左旗| 额敏县| 曲水县| 崇阳县| 镶黄旗| 水富县| 九江市| 东城区| 利津县| 呼玛县| 绵阳市| 潜山县| 涪陵区| 宁海县| 宣威市| 客服| 义乌市| 德庆县| 宜都市| 昭觉县| 海口市| 尖扎县| 五大连池市|