高效的C编程之:寄存器分配
比较下面两个完成同样功能的函数,分析全局变量的操作对程序性能的影响。
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只使用了一次内存访问指令。这对提高程序的整体性能有很大帮助。
3.指针链
指针链(PointerChains)常被用来访问结构体内部变量。下面的例子显示了一个典型的指针链的使用。
typedefstruct{intx,y,z;}Point3;
typedefstruct{Point3*pos,*direction;}Object;
voidInitPos1(Object*p)
{
p->pos->x=0;
p->pos->y=0;
p->pos->z=0;
}
上面的代码每次使用“p->pos”时都会对变量重新取值。为了提高代码效率,将程序改写如下。
voidInitPos2(Object*p)
{
Point3*pos=p->pos;
pos->x=0;
pos->y=0;
pos->z=0;
}
经过改写的代码,减少了内存访问次数,提高程序的执行效率,另外也可以在object结构体中增加一个point3域,专门作为指向p->pos的指针。
![](https://webstorage.eepw.com.cn/images/2014/m/wx.png)
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码