新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 高效的C編程之: 函數調用

        高效的C編程之: 函數調用

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

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

        14.9.2使用返回結構體

        編譯選項指示編譯器在整數寄存器中返回4個整數字的結構或者在浮點寄存器中返回4個浮點型或雙精度型值,而不使用存儲器。

        下面的例子顯示了選項的用法。

        typedefstruct{inthi;uintlo;}int64;//注意該結構中,高位為有符號整數,低位為無符號整數

        __value_in_regsint64add64(int64x,int64y)

        {int64res;

        res.lo=x.lo+y.lo;

        res.hi=x.hi+y.hi;

        if(res.loy.lo)res.hi++;//carryfromlowword

        returnres;

        }

        voidtest(void)

        {int64a,b,c,sum;

        a.hi=0x00000000;a.lo=0xF0000000;

        b.hi=0x00000001;b.lo=0x10000001;

        sum=add64(a,b);

        c.hi=0x00000002;c.lo=0xFFFFFFFF;

        sum=add64(sum,c);

        }

        編譯后的結果如下所示。

        add64

        ADDSa2,a2,a4

        ADCa1,a3,a1

        MOVpc,lr

        test

        STMDBsp!,{lr}

        MOVa1,#0

        MOVa2,#f0000000

        MOVa3,#1

        MOVa4,#10000001

        BLadd64

        MOVa3,#2

        MVNa4,#0

        LDMIAsp!,{lr}

        Badd64

        當使用__value_in_regs定義結構體時,編譯的代碼大小為52字節,如果不使用__value_in_regs選項,則編譯出的結果為160字節(本書中沒有列出未使用__value_in_regs時的編譯結果,讀者有興趣可以自己上機試驗)。

        14.9.3葉子函數

        所謂葉子函數(leaffunction)就是在其函數體內不存在對其他,它也常被稱為終級函數。因為葉子函數不需要調用其他函數,所有沒有保存/恢復寄存器的操作,因此執行效率比一般函數要高。

        當函數中必須對一些寄存器進行保存時,可以使用高效率的多寄存器存儲指令STM,對需要保存的寄存器內存一次性存儲。

        正是由于葉子函數執行的高效性,所以在編程時,盡量將子程序編寫為葉子函數,這樣即使程序中多次調用也不會影響代碼性能。

        為了高效的調用函數,可以遵循下面原則。

        ·避免在被頻繁調用的函數中調用其他函數,以保證被頻繁調用的函數被編譯器編譯為葉子函數。

        ·把比較小的被調用函數和調用函數放在同一個源文件中,并且要先定義后調用,編譯器就可以優化或內聯較小的函數。

        ·對性能影響較大的重要函數可使用關鍵字_inline進行內聯。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 纳雍县| 彩票| 馆陶县| 玉树县| 瑞金市| 开封市| 修文县| 宾阳县| 巴中市| 丹凤县| 莎车县| 三门峡市| 秦安县| 时尚| 龙门县| 宁化县| 马边| 富顺县| 祁东县| 静安区| 葵青区| 邹平县| 鄂托克旗| 东丽区| 凤台县| 宣汉县| 万荣县| 耒阳市| 普格县| 台南市| 乐亭县| 图们市| 武汉市| 阳东县| 刚察县| 碌曲县| 米脂县| 潜江市| 盐津县| 胶州市| 五原县|