新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C語言高效編程的幾招

        C語言高效編程的幾招

        作者: 時間:2012-06-27 來源:網絡 收藏

        引 言:
          編寫高效簡潔的代碼,是許多軟件工程師追求的目標。本文就工作中的一些體會和經驗做相關的闡述,不對的地方請各位指教。

        第1招:以空間換時間

          計算機程序中最大的矛盾是空間和時間的矛盾,那么,從這個角度出發逆向思維來考慮程序的效率問題,我們就有了解決問題的第1招——以空間換時間。
        例如:字符串的賦值。
        方法A,通常的辦法:
        #define LEN 32
        char string1 [LEN];
        memset (string1,0,LEN);
        strcpy (string1,“This is a example!!”);
        方法B:
        const char string2[LEN] =“This is a example!”;
        char * cp;
        cp = string2 ;
        (使用的時候可以直接用指針來操作。)

          從上面的例子可以看出,A和B的效率是不能比的。在同樣的存儲空間下,B直接使用指針就可以操作了,而A需要調用兩個字符函數才能完成。B的缺點在于靈活性沒有A好。在需要頻繁更改一個字符串內容的時候,A具有更好的靈活性;如果采用方法B,則需要預存許多字符串,雖然占用了大量的內存,但是獲得了程序執行的高效率。

          如果系統的實時性要求很高,內存還有一些,那我推薦你使用該招數。

          該招數的變招——使用宏函數而不是函數。舉例如下:
        方法C:
        #define bwMCDR2_ADDRESS 4
        #define bsMCDR2_ADDRESS 17
        int BIT_MASK(int __bf)
        {
        return ((1U (bw ## __bf)) - 1) (bs ## __bf);
        }
        void SET_BITS(int __dst, int __bf, int __val)
        {
        __dst = ((__dst) ~(BIT_MASK(__bf))) |
        (((__val) (bs ## __bf)) (BIT_MASK(__bf))))
        }

        SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
        方法D:
        #define bwMCDR2_ADDRESS 4
        #define bsMCDR2_ADDRESS 17
        #define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
        #define BIT_MASK(__bf) (((1U (bw ## __bf)) - 1) (bs ## __bf))
        #define SET_BITS(__dst, __bf, __val)
        ((__dst) = ((__dst) ~(BIT_MASK(__bf))) |
        (((__val) (bs ## __bf)) (BIT_MASK(__bf))))

        SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);

          函數和宏函數的區別就在于,宏函數占用了大量的空間,而函數占用了時間。大家要知道的是,函數調用是要使用系統的棧來保存數據的,如果編譯器里有棧檢查選項,一般在函數的頭會嵌入一些匯編語句對當前棧進行檢查;同時,CPU也要在函數調用時保存和恢復當前的現場,進行壓棧和彈棧操作,所以,函數調用需要一些CPU時間。而宏函數不存在這個問題。宏函數僅僅作為預先寫好的代碼嵌入到當前程序,不會產生函數調用,所以僅僅是占用了空間,在頻繁調用同一個宏函數的時候,該現象尤其突出。

          D方法是我看到的最好的置位操作函數,是ARM公司源碼的一部分,在短短的三行內實現了很多功能,幾乎涵蓋了所有的位操作功能。C方法是其變體,其中滋味還需大家仔細體會。


        上一頁 1 2 下一頁

        關鍵詞: C語言 高效編程

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 泸定县| 阜新| 建昌县| 八宿县| 朝阳县| 潮安县| 澄迈县| 正安县| 罗甸县| 兴业县| 宁陵县| 偏关县| 雷山县| 潢川县| 铁岭市| 玉树县| 屏南县| 丰原市| 济源市| 收藏| 民丰县| 通榆县| 合江县| 本溪市| 苍溪县| 乌兰察布市| 绩溪县| 元谋县| 葫芦岛市| 龙州县| 嵩明县| 平湖市| 汉川市| 河南省| 安溪县| 闽侯县| 肥西县| 安新县| 灵武市| 蓝山县| 安福县|