在程序优化时,对于这样一种现象不得不注意,即存储器别名使用。
那么什么是存储器别名使用呢?
简单来说,就是“两个指针可能同时指向同一个存储地址的情况”。
示例为证,考虑下面的代码序列:
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!!!
很神奇,不是吗?!所以在优化程序时,知道该注意什么了吧?
存储器别名使用!请深深将其烙印在你脑海中!