我已阅读了论文Surviving the Release Version。
根据“别名错误”条款,它说:
如果你说的话,你可以获得更严格的代码 编译器,它可以假设没有 混叠....
我还阅读了Aliasing (computing)。
变量别名究竟是什么?我理解这意味着使用指向变量的指针是一个别名,但是,它如何/为什么会影响严重,或者换句话说 - 为什么告诉编译器它可以假设没有别名会让我得到“更严格的代码”
答案 0 :(得分: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
内)。然后,优化器可以使用此信息来优化代码(在这种情况下,从跟踪指针更改“感兴趣的行”并使用简单的增量进行通用添加)。
答案 1 :(得分:5)
禁止别名意味着如果你有一个指针char* b
,你可以假设b是程序中唯一指向该特定内存位置的指针,这意味着内存位置唯一要改变的时间是当程序员使用b
进行更改时。因此,只要编译器知道没有使用b
来修改它,生成的程序集就不需要将b
指向的内存重新加载到寄存器中。如果允许别名,那么可能有另一个指针char* c = b;
在其他地方被用来弄乱那个内存