<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編程之: 函數調用

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

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

14.9

函數設計的基本原則是使其函數體盡量的小。這樣編譯器可以對函數做更多的優(yōu)化。

14.9.1減少開(kāi)銷(xiāo)

上的開(kāi)銷(xiāo)比非RISC體系結構上的調用開(kāi)銷(xiāo)?。?/p>

·調用返回指令“BL”或“MOVpc,lr”一般只需要6個(gè)指令周期(7上)。

·在函數的入口和出口使用多寄存器加載/存儲指令LDM和STM(Thumb指令使用PUSH和POP)提高函數體的執行效率。

體系結構過(guò)程調用標準AAPCS定義了如何通過(guò)寄存器傳遞參數和返回值。函數中的前4個(gè)整型參數是通過(guò)ARM的前4個(gè)寄存器r0、r1、r2和r3來(lái)傳遞的。傳遞參數可以是與整型兼容的數據類(lèi)型,如字符類(lèi)型char、半字類(lèi)型short等。

注意

如果是雙字類(lèi)型,如longlong型,只能通過(guò)寄存器傳遞兩個(gè)參數。

不能通過(guò)寄存器傳遞的參數,通過(guò)函數堆棧來(lái)傳遞。這樣不論是函數的調用者還是被調用者都必須通過(guò)訪(fǎng)問(wèn)堆棧來(lái)訪(fǎng)問(wèn)參數,使程序的執行效率下降。

下面的例子顯示了函數調用是傳遞4個(gè)參數和多于4個(gè)參數的區別。

傳遞4個(gè)參數的函數調用源文件如下。

intfunc1(inta,intb,intc,intd)

{

returna+b+c+d;

}

intcaller1(void)

{

returnfunc1(1,2,3,4);

}

編譯的結果如下。

func1

ADDr0,r0,r1

ADDr0,r0,r2

ADDr0,r0,r3

MOVpc,lr

caller1

MOVr3,#4

MOVr2,#3

MOVr1,#2

MOVr0,#1

Bfunc1

如果程序需要傳遞6個(gè)參數,變?yōu)槿缦滦问健?/p>

intfunc2(inta,intb,intc,intd,inte,intf)

{

returna+b+c+d+e+f;

}

intcaller2(void)

{

returnfunc1(1,2,3,4,5,6);

}

則編譯后的匯編文件如下。

func2

STRlr,[sp,#-4]!

ADDr0,r0,r1

ADDr0,r0,r2

ADDr0,r0,r3

LDMIBsp,{r12,r14}

ADDr0,r0,r12

ADDr0,r0,r14

LDRpc,{sp},#4

caller2

STMFDsp!,{r2,r3,lr}

MOVr3,#6

MOVr2,#5

STMIAsp,{r2,r3}

MOVr3,#4

MOVr2,#3

MOVr1,#2

MOVr0,#1

BLfunc2

LDMFDsp!,{r2,r3,pc}

綜上所述,為了在程序中高效的調用函數,最好遵循以下規則。

·盡量限制函數的參數,不要超過(guò)4個(gè),這樣函數調用的效率會(huì )更高。

·當傳遞的參數超過(guò)4個(gè)時(shí),要將多個(gè)相關(guān)參數組織在一個(gè)結構體中,用傳遞結構體指針來(lái)代替多個(gè)參數。

·避免將傳遞的參數定義為longlong型,因為傳遞一個(gè)longlong型的數據將會(huì )占用兩個(gè)32位寄存器。

·函數中存在浮點(diǎn)運算時(shí),避免使用double型參數。


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

評論


相關(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>