新聞中心

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

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

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

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

        14.9.6內嵌函數

        編譯器支持函數內嵌功能。使用關鍵字“_inline”聲明函數,可以使函數內嵌。下面的例子顯示了如何使用函數內嵌功能。

        程序源文件如下。

        __inlineintsquare(intx)

        {

        returnx*x;

        }

        #includemath.h>

        doublelength(intx,inty)

        {

        returnsqrt(square(x)+square(y));

        }

        編譯結果如下所示。

        length

        STMDBsp!,{lr}

        MULa3,a1,a1

        MLAa1,a2,a2,a3

        BL_dflt

        LDMIAsp!,{lr}

        Bsqrt

        使用函數內嵌有以下好處:

        ·減少了開銷(如寄存器的壓棧保護);

        ·減少了參數傳遞開銷;

        ·進一步提高了編譯器對代碼優化的可能性(如編譯器可將ADD和MUL指令合并為一條MLA指令)。

        但使用函數內嵌將增加代碼尺寸。也正是處于這種原因,armcc和tcc都沒有提供函數自動內嵌的編譯選項。

        一般來說,只有對性能影響較大的重要函數才使用關鍵字_inline進行內嵌。

        14.9.7函數定義

        使用函數時要先定義后調用是編程的基本規則之一。在之前定義函數,編譯器可以檢查被調用函數的寄存器使用情況,從而對其進行進一步的優化。

        首先來看下面的例子。

        intsquare(intx);

        intsumsquares1(intx,inty)

        {

        returnsquare(x)+square(y);

        }

        /*square函數可以在本文件中定義,也可以在其他源文件中定義*/

        intsquare(intx)

        {

        returnx*x;

        }

        intsumsquares2(intx,inty)

        {

        returnsquare(x)+square(y);

        }

        編譯的結果如下所示。

        sumsquares1

        STMDBsp!,{v1,v2,lr}

        MOVv1,a2

        BLsquare

        MOVv2,a1

        MOVa1,v1

        BLsquare

        ADDa1,v2,a1

        LDMIAsp!,{v1,v2,pc}

        square

        MOVa2,a1

        MULa1,a2,a2

        MOVpc,lr

        sumsquares2

        STMDBsp!,{lr}

        MOVa3,a2

        BLsquare

        MOVa4,a1

        MOVa1,a3

        BLsquare

        ADDa1,a4,a1

        LDMIAsp!,{pc}

        從編譯的結果可以看出,將square函數定義放在sumsquares函數前,編譯器可以判斷寄存器a3和a4并未使用,所有在調用函數入口處并未將其壓棧。這樣,減少了內存訪問,提高了代碼執行效率。


        上一頁 1 2 3 4 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 城固县| 东乡族自治县| 顺平县| 南城县| 抚松县| 天水市| 玉山县| 宁津县| 永平县| 道真| 新竹县| 屏东市| 延安市| 益阳市| 扬州市| 道真| 开远市| 宿州市| 阿拉尔市| 雷波县| 扬州市| 晴隆县| 漠河县| 丹凤县| 宁国市| 都兰县| 定南县| 广汉市| 曲周县| 延寿县| 衡阳市| 雷波县| 清原| 沙湾县| 同德县| 丹凤县| 白朗县| 丽江市| 清丰县| 济南市| 东城区|