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

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

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

示例为证,考虑下面的代码序列:
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!!!

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

你可能感兴趣的:(c,OS)