c++ - GNU GCC 会跟踪以前使用箭头运算符取消引用的对象吗?

标签 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;
}

如果没有,是否有任何编译器可以执行此操作?

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

最佳答案

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

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

关于c++ - GNU GCC 会跟踪以前使用箭头运算符取消引用的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54737403/

相关文章:

C++:一个作者/多个读者访问 unordered_map 线程是否安全?

c++ - 使用 clang 编译 C++ 文件时出错

导致线程锁定的 C++ 优化

c++ - 当对象具有值语义时,在方法中内联虚函数

c++ - 传递所有元素为零的数组 (C++)

c++ - 创建写入终端的附加文件描述符

c - 先前的堆栈变量

c - valgrind 不理解 bzero

C++ - g++ 链接错误的 stdlibc++

compiler-construction - 如何用编译器优化这个函数?