• <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

    3.指令重排

    當指定編譯器對程序代碼進行優化時,編譯器會對程序中排列不合理的匯編指令序列進行重排(只有在-O1及其以上的優化級別中才有),重排的目的是為了減少指令互鎖(interload)。所謂互鎖就是指如果一條指令需要前一條指令的執行結果,而這時結果還沒有出來,那么處理器就會等待。這被稱為流水線冒險(pipelinehazard),也被稱為流水線互鎖。

    下面例子顯示了對同一程序使用代碼重排和不使用代碼重排所產生的匯編碼的區別。÷

    程序的源代碼如下所示。

    intf(int*p,intx)

    {return*p+x*3;}

    使用-O0選項對代碼進行編譯(無代碼重排),產生的結果如下所示。

    ADDr1,r1,r1,LSL#1

    LDRr0,[r0,#0]

    ADDr0,r0,r1 ;9上產生互鎖

    MOVpc,lr

    使用-O1選項對代碼進行編譯(存在代碼重排),產生的結果如下所示。

    ADDr1,r1,r1,LSL#1

    ADDr0,r0,r1

    MOVpc,lr

    指令重排發生在寄存器定位和代碼產生階段。代碼重排只對9及其以后的處理器版本產生作用。當使用代碼重排時,代碼的執行速度平均提供4%。可以使用-zpno_optimize_
    scheduling編譯選項關閉代碼重排。

    4.內嵌函數

    通常情況下,如果不指定編譯選項,編譯器會將一些代碼量小且調用次數少的函數內嵌進調用函數中。如果某段子程序在其他模塊中沒有被調用,請使用Static關鍵字將其標識。

    編譯選項的--autoinline和--no_autoinline可以作為內嵌函數的使能開關。--no_autoinline選項為-O0和-O1選項的默認選項,但如果指定-O2或-O3的優化選項,編譯器將默認使用--autoinline選項。

    有關內嵌函數的詳細信息,請參見本書內嵌函數一節。

    下面的例子顯示了同一段程序,使用內嵌功能和不使用內嵌功能編譯出的不同結果。

    要編譯的源文件如下。

    intbar(inta)

    {

    a=a+5;

    returna;

    }

    intfoo(inti)

    {

    i=bar(i);

    i=i-2;

    i=bar(i);

    i++;

    returni;

    }

    下面的匯編程序為不使用內嵌功能時編譯出的結果。

    bar

    ADDr0,r0,#5

    MOVpc,lr

    foo

    STRlr,[sp,#-4]!

    BLbar

    SUBr0,r0,#2

    BLbar

    ADDr0,r0,#1

    LDRpc,[sp],#4

    下面的匯編碼是使用內嵌功能時編譯出的結果。

    foo

    ADDr0,r0,#5

    SUBr0,r0,#2

    ADDr0,r0,#5

    ADDr0,r0,#1

    MOVpc,lr

    從上面的例子可以看出在使用內嵌功能時,函數間的相互調用減少了數據的壓棧和出棧,節省了程序的執行時間,但如果內嵌函數被調用多次會造成空間的浪費。

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



    上一頁 1 2 3 下一頁

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

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 布拖县| 洪洞县| 濮阳县| 静宁县| 汾西县| 沽源县| 湘阴县| 嵊泗县| 神木县| 乐亭县| 惠水县| 开封市| 乌兰察布市| 博兴县| 德格县| 定结县| 浏阳市| 丹凤县| 汉川市| 赣州市| 霍城县| 沭阳县| 福泉市| 闻喜县| 新干县| 红安县| 文昌市| 龙门县| 永昌县| 政和县| 浙江省| 武宁县| 邢台县| 满城县| 兴仁县| 长泰县| 简阳市| 泰顺县| 米泉市| 上虞市| 荣昌县|