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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 高效的C編程之: 函數(shù)調(diào)用

          高效的C編程之: 函數(shù)調(diào)用

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

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

          14.9.4嵌套優(yōu)化

          注意

          嵌套優(yōu)化(Tail-Calloptimization)只適用于armcc。編譯時如果使用-g或-debug選項,編譯器自動關閉該功能。

          一個函數(shù)如果在其結(jié)束時調(diào)用了另一個函數(shù),則編譯器使用B指令調(diào)轉(zhuǎn)到被調(diào)用函數(shù),而非BL指令。這樣就避免了一級不必要的函數(shù)返回。圖14.3顯示了嵌套優(yōu)化的調(diào)用過程。

          圖14.3嵌套優(yōu)化過程

          當編譯時使用-O1或-O2選項時,編譯器都執(zhí)行這種嵌套優(yōu)化。需要注意的是,當函數(shù)中引用了局部變量地址,由于指針別名問題的影響,即使函數(shù)在返回時調(diào)用了其他函數(shù),編譯器也不會使用嵌套優(yōu)化。

          下面通過一個例子來分析嵌套優(yōu)化是如何提高代碼執(zhí)行效率的。

          externintfunc2(int);

          intfunc1(inta,intb)

          {if(a>b)

          return(func2(a-b));

          else

          return(func2(b-a));

          }

          編譯后的代碼如下所示。

          func1

          CMPa1,a2

          SUBLEa1,a2,a1

          SUBGTa1,a1,a2

          Bfunc2

          首先,func1中使用B指令代替BL指令,不用擔心lr寄存器被破壞,減少了對寄存器壓棧保護操作。另外,程序直接從func2返回到調(diào)用func1的函數(shù),減少一次函數(shù)返回。如果說正常的指令調(diào)用過程為:

          BL+BL+MOVpc,lr+MOVpc,lr

          那么經(jīng)過嵌套優(yōu)化的過程就可以表示為:

          BL+BL+MOVpc,lr

          這樣,總的開銷將減少25%。

          14.9.5單純子函數(shù)

          所謂單純子函數(shù)(PureFunctions)是指那些函數(shù)返回值只和調(diào)用參數(shù)有關。換句話說,就是如果調(diào)用函數(shù)的參數(shù)相同,那么函數(shù)的返回結(jié)果也相同。如果程序中存在這樣的函數(shù),可以在函數(shù)定義時使用_pure進行聲明,這樣在程序編譯時編譯器會根據(jù)函數(shù)的調(diào)用情況對其進行優(yōu)化。

          下面的例子顯示了當函數(shù)用_pure聲明時,編譯器對其所做的優(yōu)化。

          程序源碼文件如下。

          intsquare(intx)

          {

          returnx*x;

          }

          intf(intn)

          {

          returnsquare(n)+square(n)

          }

          編譯后的結(jié)果如下。

          square

          MOVa2,a1

          MULa1,a2,a2

          MOVpc,lr

          f

          STMDBsp!,{lr}

          MOVa3,a1

          BLsquare

          MOVa4,a1

          MOVa1,a3

          BLsquare

          ADDa1,a4,a1

          LDMIAsp!,{pc}

          上面的程序中,square函數(shù)為“單純子函數(shù)”,當使用_pure聲明該函數(shù)時編譯器在調(diào)用該函數(shù)時,將對程序進行優(yōu)化。

          聲明的方法和編譯后的結(jié)果如下所示。

          __pureintsquare(intx)

          {

          returnx*x;

          }

          f

          STMDBsp!,{lr}

          BLsquare

          MOVa1,a1,LSL#1

          LDMIAsp!,{pc}

          從編譯后的代碼中可以看到,用_pure聲明的函數(shù)在f函數(shù)中只調(diào)用了一次。

          雖然“單純子函數(shù)”可以提高代碼執(zhí)行效率,但同時也會帶來一些負面影響。比如,在“單純子函數(shù)”中,不能直接或間接訪問內(nèi)存地址。所以在程序中使用“單純子函數(shù)”時要特別小心。

          另外,還可以使用#pragma聲明“單純子函數(shù)”,下面的代碼顯示了它的聲明過程。

          #pragmano_side_effects

          /*functiondefinition*/

          #pragmaside_effects



          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();