在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 高效的C編程之: 函數(shù)調(diào)用

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

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

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

            14.9.4嵌套優(yōu)化

            注意

            嵌套優(yōu)化(Tail-Calloptimization)只適用于armcc。編譯時(shí)如果使用-g或-debug選項(xiàng),編譯器自動(dòng)關(guān)閉該功能。

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

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

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

            下面通過一個(gè)例子來分析嵌套優(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指令,不用擔(dān)心lr寄存器被破壞,減少了對(duì)寄存器壓棧保護(hù)操作。另外,程序直接從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ù)有關(guān)。換句話說,就是如果調(diào)用函數(shù)的參數(shù)相同,那么函數(shù)的返回結(jié)果也相同。如果程序中存在這樣的函數(shù),可以在函數(shù)定義時(shí)使用_pure進(jìn)行聲明,這樣在程序編譯時(shí)編譯器會(huì)根據(jù)函數(shù)的調(diào)用情況對(duì)其進(jìn)行優(yōu)化。

            下面的例子顯示了當(dāng)函數(shù)用_pure聲明時(shí),編譯器對(duì)其所做的優(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ù)”,當(dāng)使用_pure聲明該函數(shù)時(shí)編譯器在調(diào)用該函數(shù)時(shí),將對(duì)程序進(jìn)行優(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í)也會(huì)帶來一些負(fù)面影響。比如,在“單純子函數(shù)”中,不能直接或間接訪問內(nèi)存地址。所以在程序中使用“單純子函數(shù)”時(shí)要特別小心。

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

            #pragmano_side_effects

            /*functiondefinition*/

            #pragmaside_effects



            評(píng)論


            相關(guān)推薦

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

            關(guān)閉