<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/257024.htm

          3.指令重排

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

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

          程序的源代碼如下所示。

          intf(int*p,intx)

          {return*p+x*3;}

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

          ADDr1,r1,r1,LSL#1

          LDRr0,[r0,#0]

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

          MOVpc,lr

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

          ADDr1,r1,r1,LSL#1

          ADDr0,r0,r1

          MOVpc,lr

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

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

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

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

          有關(guān)內(nèi)嵌函數(shù)的詳細信息,請參見本書內(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;

          }

          下面的匯編程序為不使用內(nèi)嵌功能時編譯出的結(jié)果。

          bar

          ADDr0,r0,#5

          MOVpc,lr

          foo

          STRlr,[sp,#-4]!

          BLbar

          SUBr0,r0,#2

          BLbar

          ADDr0,r0,#1

          LDRpc,[sp],#4

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

          foo

          ADDr0,r0,#5

          SUBr0,r0,#2

          ADDr0,r0,#5

          ADDr0,r0,#1

          MOVpc,lr

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

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



          上一頁 1 2 3 下一頁

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

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();