编译后的结果如下。
test2
STMDBsp!,{v1,lr}
STRa1,[sp,#-4]!
MOVa1,sp
BLf
LDRv1,[sp,#0]
MOVa1,v1
BLg
ADDv1,a1,v1
MOVa1,v1
BLg
ADDa1,a1,v1
ADDsp,sp,#4
LDMIAsp!,{v1,pc}
从编译结果可以看出,修改后的代码只使用了2次内存访问,而test1为4次内存访问。
总上所述,为了在程序中避免指针别名,应该做到:
·避免使用局部变量地址;
·如果程序中出现多次对同一指针的访问,应先将其值取出并保存到临时变量中。
2.全局变量
通常情况下,编译器不会为全局变量分配寄存器。这样在程序中使用全局变量,很可能带来内存访问上的开销。所有尽量避免在循环体内使用全局变量,以减少对内存的访问次数。
如果在一段程序体内大量使用了同一个全局变量,建议在使用前先将其拷贝到一个局部的临时变量中,当完成对它的全部操作后,再将其写回到内存。
比较下面两个完成同样功能的函数,分析全局变量的操作对程序性能的影响。
intf(void);
intg(void);
interrs;
voidtest1(void)
{
errs+=f();
errs+=g();
}
voidtest2(void)
{
intlocalerrs=errs;
localerrs+=f();
localerrs+=g();
errs=localerrs;
}
编译结果如下。
test1
STMDBsp!,{v1,lr}
BLf
LDRv1,[pc,#L00002c-.-8]
LDRa2,[v1,#0]
ADDa1,a1,a2
STRa1,[v1,#0]
BLg
LDRa2,[v1,#0]
ADDa1,a1,a2
STRa1,[v1,#0]
LDMIAsp!,{v1,pc}
L00002c
DCD|x$dataseg|
test2
STMDBsp!,{v1,v2,lr}
LDRv1,[pc,#L00002c-.-8]
LDRv2,[v1,#0]
BLf
ADDv2,a1,v2
BLg
ADDa1,a1,v2
STRa1,[v1,#0]
LDMIAsp!,{v1,v2,pc}
从编译的结果中可以看出,test1中每次对全局变量errs的访问都会使用耗时的Load/Store指令;而test2只使用了一次内存访问指令。这对提高程序的整体性能有很大帮助。