高效的C編程之: 函數(shù)調(diào)用
14.9.2使用__value_in_regs返回結(jié)構(gòu)體
編譯選項(xiàng)__value_in_regs指示編譯器在整數(shù)寄存器中返回4個(gè)整數(shù)字的結(jié)構(gòu)或者在浮點(diǎn)寄存器中返回4個(gè)浮點(diǎn)型或雙精度型值,而不使用存儲(chǔ)器。
下面的例子顯示了__value_in_regs選項(xiàng)的用法。
typedefstruct{inthi;uintlo;}int64;//注意該結(jié)構(gòu)中,高位為有符號(hào)整數(shù),低位為無(wú)符號(hào)整數(shù)
__value_in_regsint64add64(int64x,int64y)
{int64res;
res.lo=x.lo+y.lo;
res.hi=x.hi+y.hi;
if(res.loy.lo)res.hi++;//carryfromlowword
returnres;
}
voidtest(void)
{int64a,b,c,sum;
a.hi=0x00000000;a.lo=0xF0000000;
b.hi=0x00000001;b.lo=0x10000001;
sum=add64(a,b);
c.hi=0x00000002;c.lo=0xFFFFFFFF;
sum=add64(sum,c);
}
編譯后的結(jié)果如下所示。
add64
ADDSa2,a2,a4
ADCa1,a3,a1
MOVpc,lr
test
STMDBsp!,{lr}
MOVa1,#0
MOVa2,#f0000000
MOVa3,#1
MOVa4,#10000001
BLadd64
MOVa3,#2
MVNa4,#0
LDMIAsp!,{lr}
Badd64
當(dāng)使用__value_in_regs定義結(jié)構(gòu)體時(shí),編譯的代碼大小為52字節(jié),如果不使用__value_in_regs選項(xiàng),則編譯出的結(jié)果為160字節(jié)(本書(shū)中沒(méi)有列出未使用__value_in_regs時(shí)的編譯結(jié)果,讀者有興趣可以自己上機(jī)試驗(yàn))。
14.9.3葉子函數(shù)
所謂葉子函數(shù)(leaffunction)就是在其函數(shù)體內(nèi)不存在對(duì)其他函數(shù)調(diào)用,它也常被稱為終級(jí)函數(shù)。因?yàn)槿~子函數(shù)不需要調(diào)用其他函數(shù),所有沒(méi)有保存/恢復(fù)寄存器的操作,因此執(zhí)行效率比一般函數(shù)要高。
當(dāng)函數(shù)中必須對(duì)一些寄存器進(jìn)行保存時(shí),可以使用高效率的多寄存器存儲(chǔ)指令STM,對(duì)需要保存的寄存器內(nèi)存一次性存儲(chǔ)。
正是由于葉子函數(shù)執(zhí)行的高效性,所以在編程時(shí),盡量將子程序編寫(xiě)為葉子函數(shù),這樣即使程序中多次調(diào)用也不會(huì)影響代碼性能。
為了高效的調(diào)用函數(shù),可以遵循下面函數(shù)調(diào)用原則。
·避免在被頻繁調(diào)用的函數(shù)中調(diào)用其他函數(shù),以保證被頻繁調(diào)用的函數(shù)被編譯器編譯為葉子函數(shù)。
·把比較小的被調(diào)用函數(shù)和調(diào)用函數(shù)放在同一個(gè)源文件中,并且要先定義后調(diào)用,編譯器就可以優(yōu)化函數(shù)調(diào)用或內(nèi)聯(lián)較小的函數(shù)。
·對(duì)性能影響較大的重要函數(shù)可使用關(guān)鍵字_inline進(jìn)行內(nèi)聯(lián)。
評(píng)論