2010-05-31 73 views
6

我已阅读文章Surviving the Release VersionC++变量别名 - 究竟是什么,为什么关闭它会更好?

在“别名错误”的条款,它说:

如果你告诉 ,它可以不承担 混淆编译器你可以得到更紧凑的代码....

我我也读过Aliasing (computing)

到底什么是可变的别名?我明白这意味着使用指针变量的别名,但如何/为什么它会影响严重,或者换句话说 - 为什么讲它可以假定没有走样,编译器会得到我一个“更紧凑的代码”

回答

5

如果不允许混叠装置,如果有一个指针char* b,可以假设b为在程序中仅指针指向该特定存储器位置,这意味着存储器位置都不会改变是当程序员使用b的唯一时间更改。因此,只要编译器知道没有使用b来修改它,生成的程序集就不需要将b指向的内存重新加载到寄存器中。如果允许别名,可能有另一个指针char* c = b;,在其他地方使用该内存混乱

+0

“生成的程序集因此不需要重新加载b指向的内存”。这就是我所需要的,谢谢。其实,在阅读你的答案之后,才真正理解了塞缪尔的回答,因为你完成了这个谜题。那么谢谢你们! – Poni 2010-05-31 21:44:43

12

别名是当你有两个不同的引用到相同的底层内存。考虑这个由例如:

int doit(int *n1, int *n2) 
{ 
    int x = 0; 

    if (*n1 == 1) 
    { 
     *n2 = 0; 

     x += *n1 // line of interest 
    } 

    return x; 
} 

int main() 
{ 
    int x = 1; 

    doit(&x, &x); // aliasing happening 
} 

如果编译器允许走样,需要考虑的可能性,n1 == n2。因此,当需要在“利益线”处使用*n1的值时,需要考虑其被*n2 = 0行更改的可能性。

如果编译器可以假设没有混叠,它可以假设在“感兴趣的线”*n1 == 1(因为否则我们不会在if之内)。然后优化器可以使用这些信息来优化代码(在这种情况下,从跟随指针改变“感兴趣的行”,并使用一个简单的增量来执行通用附加操作)。