C ++变量别名 - 究竟是什么,为什么关闭时更好?

时间:2010-05-31 18:33:30

标签: c++ variable-alias

我已阅读了论文Surviving the Release Version

根据“别名错误”条款,它说:

  

如果你说的话,你可以获得更严格的代码   编译器,它可以假设没有   混叠....

我还阅读了Aliasing (computing)

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

2 个答案:

答案 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;在其他地方被用来弄乱那个内存