在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 高效的C編程之:C編譯器及其優(yōu)化

            高效的C編程之:C編譯器及其優(yōu)化

            作者: 時(shí)間:2013-09-30 來源:網(wǎng)絡(luò) 收藏

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

            3.指令重排

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

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

            程序的源代碼如下所示。

            intf(int*p,intx)

            {return*p+x*3;}

            使用-O0選項(xiàng)對代碼進(jìn)行編譯(無代碼重排),產(chǎn)生的結(jié)果如下所示。

            ADDr1,r1,r1,LSL#1

            LDRr0,[r0,#0]

            ADDr0,r0,r1 ;9上產(chǎn)生互鎖

            MOVpc,lr

            使用-O1選項(xiàng)對代碼進(jìn)行編譯(存在代碼重排),產(chǎn)生的結(jié)果如下所示。

            ADDr1,r1,r1,LSL#1

            ADDr0,r0,r1

            MOVpc,lr

            指令重排發(fā)生在寄存器定位和代碼產(chǎn)生階段。代碼重排只對9及其以后的處理器版本產(chǎn)生作用。當(dāng)使用代碼重排時(shí),代碼的執(zhí)行速度平均提供4%??梢允褂?zpno_optimize_
            scheduling編譯選項(xiàng)關(guān)閉代碼重排。

            4.內(nèi)嵌函數(shù)

            通常情況下,如果不指定編譯選項(xiàng),編譯器會(huì)將一些代碼量小且調(diào)用次數(shù)少的函數(shù)內(nèi)嵌進(jìn)調(diào)用函數(shù)中。如果某段子程序在其他模塊中沒有被調(diào)用,請使用Static關(guān)鍵字將其標(biāo)識(shí)。

            編譯選項(xiàng)的--autoinline和--no_autoinline可以作為內(nèi)嵌函數(shù)的使能開關(guān)。--no_autoinline選項(xiàng)為-O0和-O1選項(xiàng)的默認(rèn)選項(xiàng),但如果指定-O2或-O3的優(yōu)化選項(xiàng),編譯器將默認(rèn)使用--autoinline選項(xiàng)。

            有關(guān)內(nèi)嵌函數(shù)的詳細(xì)信息,請參見本書內(nèi)嵌函數(shù)一節(jié)。

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

            要編譯的源文件如下。

            intbar(inta)

            {

            a=a+5;

            returna;

            }

            intfoo(inti)

            {

            i=bar(i);

            i=i-2;

            i=bar(i);

            i++;

            returni;

            }

            下面的匯編程序?yàn)椴皇褂脙?nèi)嵌功能時(shí)編譯出的結(jié)果。

            bar

            ADDr0,r0,#5

            MOVpc,lr

            foo

            STRlr,[sp,#-4]!

            BLbar

            SUBr0,r0,#2

            BLbar

            ADDr0,r0,#1

            LDRpc,[sp],#4

            下面的匯編碼是使用內(nèi)嵌功能時(shí)編譯出的結(jié)果。

            foo

            ADDr0,r0,#5

            SUBr0,r0,#2

            ADDr0,r0,#5

            ADDr0,r0,#1

            MOVpc,lr

            從上面的例子可以看出在使用內(nèi)嵌功能時(shí),函數(shù)間的相互調(diào)用減少了數(shù)據(jù)的壓棧和出棧,節(jié)省了程序的執(zhí)行時(shí)間,但如果內(nèi)嵌函數(shù)被調(diào)用多次會(huì)造成空間的浪費(fèi)。

            c語言相關(guān)文章:c語言教程



            上一頁 1 2 3 下一頁

            關(guān)鍵詞: C編程 C編譯器 ARM

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉