• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

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

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

    本文引用地址:http://www.czjhyjcfj.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

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 永兴县| 黄平县| 梧州市| 长武县| 剑川县| 双江| 永康市| 浏阳市| 汉阴县| 临潭县| 长治县| 巍山| 谷城县| 阳谷县| 龙岩市| 集安市| 江油市| 金乡县| 沭阳县| 六枝特区| 英山县| 盘锦市| 大同市| 明光市| 马鞍山市| 丹阳市| 陈巴尔虎旗| 竹山县| 红河县| 项城市| 宣城市| 台南市| 冷水江市| 杭锦旗| 大同市| 新乡县| 淳安县| 安远县| 樟树市| 新龙县| 博客|