Pointer aliasing ,简单来说,下面两段代码并不是等价的:
void f1(int* x, int* y) {
*x += *y;
*x += *y;
}
void f2(int* x, int* y) {
*x += 2*(*y);
}
这是因为,x 和 y 两个指针可能指向相同的内存。考虑 f(x, x),第一段代码将把 *x 变为 4(*x),而第二段代码则会把 *x 变为 3(*x)。
Pointer aliasing 可能会抑制编译器做出某些优化。比如在上面的代码中,f1() 需要 5 次访存而 f2() 仅需三次,后者更优。但由于编译器并不能假设 x 和 y ,它不敢做这个优化。
Q: 为什么第一段代码是5次访存,第二段代码是3次?为啥说“不敢”做这个优化,即使做了这个优化,f所造成的结果不一样,优化不是错的吗?还是说就是因为两次优化结果不一样,才让编译器“不敢”做这个优化呢?