GNU GCC是否会跟踪以前使用箭头运算符取消引用的对象?

时间:2019-02-17 20:28:58

标签: c++ gcc compiler-optimization dereference

使用以下结构,

struct A
{
    A(int d1, int d2)
    {
        data1 = d1;
        data2 = d2;
    }

    int data1, data2;
};

函数下面的最后一行会再次取消引用指针,还是编译器知道使用先前取消引用的对象?

int main()
{
    A* a = new A(1, 2);

    //dereference a
    cout << a->data1 << endl;

    //dereference a again?
    cout << a->data2 << endl;
}

如果没有,是否有任何编译器可以做到这一点?

我知道我可以做一个实验来测试我的问题,但是我不太了解汇编语言。

1 个答案:

答案 0 :(得分:1)

是的,在这种情况下,生成的代码可能不会在字面上执行另一个取消引用。当编译器可以肯定地说a在这两个语句之间不会改变时,就会发生这种情况。

这是优化的常见类别,并且是当人们违反严格别名规则时导致许多错误的原因(因为这可能会破坏编译器检测a的能力更改)。

相关问题