程序优化之存储器别名使用

说明:本文示例摘自《深入理解计算机系统》第五章----优化程序性能。

在程序优化时,对于这样一种现象不得不注意,即存储器别名使用。
那么什么是存储器别名使用呢?
简单来说,就是“两个指针可能同时指向同一个存储地址的情况”。

示例为证,考虑下面的代码序列:

x = 1000;
y = 3000;
*q = y;
*p = x;
t1 = *q;

最终t1是多少呢?可能很多人会不假思索就回答3000,然而事实上它是完全有可能等于1000的,这种情况取决于指针p和q是否指向同一个地址,即p是否等于q。

再来看另一个例子:

void twiddle1(int *xp, int *yp){
*xp += *yp;
*xp += *yp;
}

void twiddle2(int *xp, int *yp){
*xp += 2 * *yp;
}

乍一看,这两个函数似乎相同,其实不然,同样的道理,这样认为的人还是忽视了存储器别名使用的情况,但xp与yp都指向同一片内存时,差异就显示出来了,前者中xp的值会增加4倍,而后者却只增加3倍!

这样的例子还有很多,比如遇到全局变量时,如下例:

int f();

int func1(){
return f() + f() + f() + f();
}

int func2(){
return 4*f();
}


此时又如何呢?它们一定会返回同样的结果吗?非也!比如出现这样的情况:

int counter = 0;

int f(){
return counter++;
}


注意此时在func1中f()调用了4次,最终结果为 0+1+2+3= 6, 而func2中却只调用了1次,最终结果为4*0=0!!!

很神奇,不是吗?!所以在优化程序时,知道该注意什么了吧?
存储器别名使用!请深深将其烙印在你脑海中!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值