我已阅读文章Surviving the Release Version。C++变量别名 - 究竟是什么,为什么关闭它会更好?
在“别名错误”的条款,它说:
如果你告诉 ,它可以不承担 混淆编译器你可以得到更紧凑的代码....
我我也读过Aliasing (computing)。
到底什么是可变的别名?我明白这意味着使用指针变量的别名,但如何/为什么它会影响严重,或者换句话说 - 为什么讲它可以假定没有走样,编译器会得到我一个“更紧凑的代码”
我已阅读文章Surviving the Release Version。C++变量别名 - 究竟是什么,为什么关闭它会更好?
在“别名错误”的条款,它说:
如果你告诉 ,它可以不承担 混淆编译器你可以得到更紧凑的代码....
我我也读过Aliasing (computing)。
到底什么是可变的别名?我明白这意味着使用指针变量的别名,但如何/为什么它会影响严重,或者换句话说 - 为什么讲它可以假定没有走样,编译器会得到我一个“更紧凑的代码”
如果不允许混叠装置,如果有一个指针char* b
,可以假设b为在程序中仅指针指向该特定存储器位置,这意味着存储器位置都不会改变是当程序员使用b
的唯一时间更改。因此,只要编译器知道没有使用b
来修改它,生成的程序集就不需要将b
指向的内存重新加载到寄存器中。如果允许别名,可能有另一个指针char* c = b;
,在其他地方使用该内存混乱
别名是当你有两个不同的引用到相同的底层内存。考虑这个由例如:
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
之内)。然后优化器可以使用这些信息来优化代码(在这种情况下,从跟随指针改变“感兴趣的行”,并使用一个简单的增量来执行通用附加操作)。
“生成的程序集因此不需要重新加载b指向的内存”。这就是我所需要的,谢谢。其实,在阅读你的答案之后,才真正理解了塞缪尔的回答,因为你完成了这个谜题。那么谢谢你们! – Poni 2010-05-31 21:44:43