7

我已经阅读了在发行版中幸存的文章。

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

如果您告诉编译器它可以假定没有别名,您可以获得更严格的代码......

我也读过Aliasing (computing)

变量别名到底是什么?我理解这意味着使用指向变量的指针是一个别名,但是,它如何/为什么会产生严重影响,或者换句话说 - 为什么告诉编译器它可以假设没有别名会给我一个“更严格的代码”

4

2 回答 2

13

别名是指对同一底层内存有两个不同的引用。考虑这个组成的例子:

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. 因此,当它需要使用*n1at “line of interest” 的值时,需要考虑到它被 line 改变的可能性*n2 = 0

如果编译器可以假设没有别名,它可以假设在“感兴趣的行” *n1 == 1(因为否则我们不会在 内部if)。然后,优化器可以使用此信息来优化代码(在这种情况下,将“感兴趣的行”从跟随指针并进行通用添加更改为使用简单的增量)。

于 2010-05-31T18:58:19.783 回答
6

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

于 2010-05-31T18:39:06.477 回答