我已经阅读了在发行版中幸存的文章。
在“别名错误”条款下,它说:
如果您告诉编译器它可以假定没有别名,您可以获得更严格的代码......
我也读过Aliasing (computing)。
变量别名到底是什么?我理解这意味着使用指向变量的指针是一个别名,但是,它如何/为什么会产生严重影响,或者换句话说 - 为什么告诉编译器它可以假设没有别名会给我一个“更严格的代码”
我已经阅读了在发行版中幸存的文章。
在“别名错误”条款下,它说:
如果您告诉编译器它可以假定没有别名,您可以获得更严格的代码......
我也读过Aliasing (computing)。
变量别名到底是什么?我理解这意味着使用指向变量的指针是一个别名,但是,它如何/为什么会产生严重影响,或者换句话说 - 为什么告诉编译器它可以假设没有别名会给我一个“更严格的代码”
别名是指对同一底层内存有两个不同的引用。考虑这个组成的例子:
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
at “line of interest” 的值时,需要考虑到它被 line 改变的可能性*n2 = 0
。
如果编译器可以假设没有别名,它可以假设在“感兴趣的行” *n1 == 1
(因为否则我们不会在 内部if
)。然后,优化器可以使用此信息来优化代码(在这种情况下,将“感兴趣的行”从跟随指针并进行通用添加更改为使用简单的增量)。
禁止别名意味着如果您有一个指针char* b
,您可以假设 b 是程序中唯一指向该特定内存位置的指针,这意味着该内存位置唯一会改变的时间是程序员b
用来改变它的时候。b
因此,只要编译器知道没有任何东西用来b
修改它,生成的程序集就不需要将指向的内存重新加载到寄存器中。如果允许使用别名,则可能有另一个指针char* c = b;
在其他地方被用来弄乱该内存