<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

3.指令重排

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

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

程序的源代碼如下所示。

intf(int*p,intx)

{return*p+x*3;}

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

ADDr1,r1,r1,LSL#1

LDRr0,[r0,#0]

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

MOVpc,lr

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

ADDr1,r1,r1,LSL#1

ADDr0,r0,r1

MOVpc,lr

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

4.內嵌函數

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

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

有關(guān)內嵌函數的詳細信息,請參見(jiàn)本書(shū)內嵌函數一節。

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

要編譯的源文件如下。

intbar(inta)

{

a=a+5;

returna;

}

intfoo(inti)

{

i=bar(i);

i=i-2;

i=bar(i);

i++;

returni;

}

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

bar

ADDr0,r0,#5

MOVpc,lr

foo

STRlr,[sp,#-4]!

BLbar

SUBr0,r0,#2

BLbar

ADDr0,r0,#1

LDRpc,[sp],#4

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

foo

ADDr0,r0,#5

SUBr0,r0,#2

ADDr0,r0,#5

ADDr0,r0,#1

MOVpc,lr

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

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



上一頁(yè) 1 2 3 下一頁(yè)

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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>