ARM優(yōu)化之函數(shù)的形參數(shù)量
翻閱了其他資料以及下面的代碼比對(duì)表明,多出來(lái)的參數(shù)傳遞的時(shí)候,需要使用棧,而棧需要使用額外的指令以及對(duì)慢速存儲(chǔ)單元的讀寫(xiě),所以不超過(guò) 4 個(gè)參數(shù)的函數(shù)是很有利于程序的優(yōu)化。
本文引用地址:http://butianyuan.cn/article/201611/316664.htm
測(cè)試代碼如下:
第一段為采用4個(gè)參數(shù)的函數(shù):
view plain copy to clipboard print ?
01.int Test( void )
02.{
03. return SubCode (1,2,3,4);
04.}
05.
06.int SubCode( int a, int b, int c, int d)
07.{
08. return a+b+c+d;
09.}
view plaincopy to clipboardprint?
00.int Test(void)
00.{
00. return SubCode (1,2,3,4);
00.}
00.
00.int SubCode(int a, int b, int c, int d)
00.{
00. return a+b+c+d;
00.}
這段會(huì)編譯成
view plain copy to clipboard print ?
01.Test
02.MOV r3,#4
03.MOV r2,#3
04.MOV r1,#2
05.MOV r0,#1
06.B SubCode
07.
08.SubCode
09.ADD r0,r0,r1
10.ADD r0,r0,r2
11.ADD r0,r0,r3
12.MOV pc,lr
view plaincopy to clipboardprint?
00.Test
00.MOV r3,#4
00.MOV r2,#3
00.MOV r1,#2
00.MOV r0,#1
00.B SubCode
00.
00.SubCode
00.ADD r0,r0,r1
00.ADD r0,r0,r2
00.ADD r0,r0,r3
00.MOV pc,lr
第二段為采用6個(gè)參數(shù)的函數(shù):
view plain copy to clipboard print ?
01.int Test( void )
02.{
03. return SubCode (1,2,3,4,5,6);
04.}
05.
06.int SubCode( int a, int b, int c, int d, int e, int f)
07.{
08. return a+b+c+d+e+f;
09.}
view plaincopy to clipboardprint?
00.int Test(void)
00.{
00. return SubCode (1,2,3,4,5,6);
00.}
00.
00.int SubCode(int a, int b, int c, int d, int e, int f)
00.{
00. return a+b+c+d+e+f;
00.}
而這段又會(huì)編譯成:
view plain copy to clipboard print ?
01.Test
02.STMFD sp!,{r2,r3,lr}
03.MOV r3,#6
04.MOV r2,#5
05.STMIA sp,{r2,r3}
06.MOV r3,#4
07.MOV r2,#3
08.MOV r1,#2
09.MOV r0,#1
10.BL SubCode
11.LDMFD sp!,{r2,r3,pc}
12.
13.SubCode
14.STR lr, [sp,#-4]!
15.ADD r0,r0,r1
16.ADD r0,r0,r2
17.ADD r0,r0,r3
18.LDMIB sp,{r12,r14}
19.ADD r0,r0,r12
20.ADD r0,r0,r14
21.LDR pc,{sp},#4
view plaincopy to clipboardprint?
00.Test
00.STMFD sp!,{r2,r3,lr}
00.MOV r3,#6
00.MOV r2,#5
00.STMIA sp,{r2,r3}
00.MOV r3,#4
00.MOV r2,#3
00.MOV r1,#2
00.MOV r0,#1
00.BL SubCode
00.LDMFD sp!,{r2,r3,pc}
00.
00.SubCode
00.STR lr, [sp,#-4]!
00.ADD r0,r0,r1
00.ADD r0,r0,r2
00.ADD r0,r0,r3
00.LDMIB sp,{r12,r14}
00.ADD r0,r0,r12
00.ADD r0,r0,r14
00.LDR pc,{sp},#4
就上面看來(lái),增加了兩個(gè)參數(shù),就會(huì)增加很多代碼用來(lái)完成這次調(diào)用。但是我們也無(wú)法保證函數(shù)的參數(shù)一定是小于4個(gè)的,所以這里筆者建議,如果函數(shù)的參數(shù)必須要4個(gè)以上的時(shí)候,可以采用結(jié)構(gòu)體的方式來(lái)減少參數(shù)的個(gè)數(shù)。
這樣的優(yōu)化,對(duì)于一些經(jīng)常需要調(diào)用的函數(shù),或者需要快速響應(yīng)的情況下,還是非常必要的。
評(píng)論