新聞中心

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

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

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

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

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 鹤庆县| 邯郸县| 闽侯县| 包头市| 安乡县| 台东市| 方山县| 辽阳市| 涿鹿县| 聂荣县| 云梦县| 德安县| 黔南| 中西区| 桂林市| 凤台县| 廊坊市| 武汉市| 焉耆| 名山县| 阳曲县| 菏泽市| 云南省| 澳门| 沂源县| 赞皇县| 昆山市| 英德市| 高州市| 达孜县| 石渠县| 西林县| 蒙阴县| 砀山县| 南康市| 晋宁县| 西丰县| 图木舒克市| 宁强县| 河源市| 衡水市|