新聞中心

        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 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 临澧县| 无极县| 饶河县| 大化| 蓬安县| 塔城市| 蛟河市| 阳曲县| 大竹县| 临潭县| 冀州市| 泽库县| 永仁县| 三穗县| 隆尧县| 南部县| 广水市| 阳城县| 逊克县| 临夏市| 保康县| 莱阳市| 南和县| 修水县| 盈江县| 于都县| 县级市| 敦化市| 景谷| 麟游县| 平阳县| 长葛市| 科技| 鄂托克前旗| 安徽省| 万安县| 泗阳县| 崇阳县| 长乐市| 武川县| 呼和浩特市|