新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 高效的C編程之:C編譯器及其優化

        高效的C編程之:C編譯器及其優化

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

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

        如果不生成調試表,這是默認優化級別。

        ·-O3:最高優化級別。使用該優化級別,使生成的代碼在時間和空間上尋求平衡。該選項常和-Ospace和-Otime配合使用。

        ·-O3–Otime:使用該選項編譯的代碼比-O2–Otime選項編譯的代碼,在執行速度上要快,但占用的空間也更大。

        ·-O3-Ospace:產生的代碼比使用-O2-Ospace選項產生的代碼尺寸小,但執行效率可能會差。

        如果要使編譯的代碼更側重于代碼的尺寸或執行效率(兩者往往不可兼得),可以使用下面的編譯選項。

        ·-Ospace:指示編譯程序執行優化,以延長執行時間為代價減小映像大小。例如,由外部函數調用代替內聯函數。如果代碼大小比性能更重要,則使用該選項。這是編譯器的默認設置。

        ·-Otime:指示編譯程序執行優化,以增大映像大小為代價縮短執行時間。如果執行時間比代碼大小更重要,則使用該選項。例如,它編譯:

        while(expression)body;

        為:

        if(expression){

        dobody;

        while(expression);

        }

        如果既不指定-Otime也不指定-Ospace,則編譯器默認使用-Ospace。可使用-Otime編譯代碼中對時間要求嚴格的部分,使用-Ospace編譯其余部分。但不能在同一編譯程序調用中同時指定-Otime和-Ospace。

        14.1.4AAPCS選項

        結構過程調用標準AAPCS(ProcedureCallStandardfortheArchitecture)是體系結構二進制接口ABI(ApplicationBinaryInterfacefortheARMArchitecture【BSABI】)標準的一部分。使用該標準可以很方便的執行C和匯編語言的相互調用。

        編譯程序時,使用--apcs選項可以指定所使用得AAPCS標準的版本。如果沒有指定--apcs或--cpu選項,則編譯器使用下面默認編譯選項。

        --apcs/noswst/nointer/noropi/norwpi--cpuARM7TDMI--fpusoftvfp

        有關AAPCS的詳細信息,請參加ARM相關文檔。

        14.1.5編譯選項對代碼生成影響示例

        本節舉例說明編譯器的優化選項如何影響代碼生成。

        1.使用-O0選項

        下面的例子顯示了即使使用-O0編譯選項對代碼進行編譯時,有些冗余代碼還是會被編譯器自動清除。

        intf(int*p)

        {

        return(*p==*p);

        }

        使用armcc-c-O0對源程序進行編譯,生成的匯編代碼如下所示。

        f

        MOVr1,r0

        MOVr0,#1

        MOVpc,lr

        通過上面的例子可以看到,編譯出的最終代碼中沒有加載(Load)指針P的值,變量*p被編譯器優化掉了。如果不想讓編譯器對變量*p做優化,可以使用“volatile”對變量進行聲明。下面的例子,顯示了將變量聲明為“volatile”類型后,使用armcc編譯(-O2的優化級別)后的結果。

        f

        LDRr1,[r0]

        LDRr0,[r0]

        CMPr1,r0

        MOVNEr0,#0

        MOVEQr0,#1

        MOVpc,lr

        另外,編譯的代碼中的“MOVr1,r0”并沒有實際意義,只是為了方便調試程序時設置斷點使用。

        2.冗余代碼的清除

        下面例子顯示了一段急待優化的代碼。

        intdummy()

        {

        inta=10,b=20;

        intc;

        c=a+b;

        return0;

        }

        當使用arm–c–O0進行編譯時,產生的匯編碼如下所示。

        dummy:

        0000807CE3A0100AMOV r1,#0xa

        >>>REDUNDANT#3inta=10,b=20;

        00008080E3A02014MOV r2,#0x14

        >>>REDUNDANT#5c=a+b;

        00008084E0813002ADD r3,r1,r2

        >>>REDUNDANT#6return0;

        00008088E3A00000MOV r0,#0

        >>>REDUNDANT#7}

        0000808CE12FFF1EBX r14

        從上面的匯編輸出可以看到,編譯器并沒有對程序中的冗余變量做任何工作。但上面這段代碼在編譯時,編譯器會給出警告,警告信息如下所示。

        Warning:#550-D:variablecwassetbutneverused

        Redundant.cline4intc;

        但如果將編譯器的優化級別提高,如使用arm–c–O1命令,則編譯器輸出的匯編代碼如下所示。

        dummy:

        0000807CE3A00000MOVr0,#0

        >>>REDUNDANT#7}

        00008080E12FFF1EBXr14

        從上面的例子看出,當優化級別提高到-O1時,程序中的冗余變量就會被清除。

        c語言相關文章:c語言教程




        關鍵詞: C編程 C編譯器 ARM

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 合水县| 邵阳县| 凤凰县| 洞头县| 金昌市| 乌兰察布市| 黑水县| 阿坝县| 陆丰市| 龙南县| 洪泽县| 兴国县| 黄石市| 石城县| 遵化市| 四川省| 修文县| 尚志市| 乌鲁木齐县| 陕西省| 桐柏县| 九寨沟县| 明水县| 青川县| 中方县| 山丹县| 黔西| 米林县| 轮台县| 铁岭市| 延吉市| 安吉县| 桐柏县| 钟祥市| 广宁县| 新沂市| 交口县| 临泽县| 惠州市| 巴彦县| 苗栗县|