Pon*_*oni 7 c++ variable-alias
我已经阅读了文章" 幸存版本".
根据"别名错误"条款,它说:
如果告诉编译器它可以假设没有别名,你可以得到更严格的代码....
我也读过Aliasing(计算).
变量别名究竟是什么?我理解这意味着使用指向变量的指针是一个别名,但是,它如何/为什么会影响严重,或者换句话说 - 为什么告诉编译器它可以假设没有别名会让我得到"更严格的代码"
R S*_*hko 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
}
Run Code Online (Sandbox Code Playgroud)
如果编译器必须允许别名,则需要考虑这种可能性n1 == n2.因此,当需要使用*n1"感兴趣的线" 的值时,需要考虑它被线改变的可能性*n2 = 0.
如果编译器可以假定没有别名,它可以假设"感兴趣的线" *n1 == 1(因为否则我们不在其中if).然后,优化器可以使用此信息来优化代码(在这种情况下,从跟随指针更改"感兴趣的行"并使用简单的增量进行通用添加).
禁止别名意味着如果你有一个指针char* b,你可以假设b是程序中指向特定内存位置的唯一指针,这意味着内存位置改变的唯一时间是程序员b用来改变它.因此b,只要编译器知道没有用于b修改它的内容,生成的程序集就不需要将指向的内存重新加载到寄存器中.如果允许别名,则可能存在另一个指针char* c = b;,该指针在别处被用来混乱该内存