翻阅了其他资料以及下面的代码比对表明,多出来的参数传递的时候,需要使用栈,而栈需要使用额外的指令以及对慢速存储单元的读写,所以不超过 4 个参数的函数是很有利于程序的优化。
测试代码如下:
第一段为采用4个参数的函数:
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.}
这段会编译成
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个参数的函数:
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.}
而这段又会编译成:
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
就上面看来,增加了两个参数,就会增加很多代码用来完成这次调用。但是我们也无法保证函数的参数一定是小于4个的,所以这里笔者建议,如果函数的参数必须要4个以上的时候,可以采用结构体的方式来减少参数的个数。
这样的优化,对于一些经常需要调用的函数,或者需要快速响应的情况下,还是非常必要的。
上一篇:关于ARM和存储器地址线错位连接详解
下一篇:一个相当详细的MINI2440按键驱动详解
推荐阅读最新更新时间:2024-03-16 15:04