代码之家  ›  专栏  ›  技术社区  ›  geza

当编译器看不到可以实现转换的可能类型时,是否允许编译器优化可变指针的动态转换?

  •  9
  • geza  · 技术社区  · 6 年前

    看看这个小片段:

    struct A {
        virtual ~A() { }
    };
    
    struct B { };
    
    bool fn() {
        A *volatile a = new A;
        return dynamic_cast<B *>(a); 
    }
    

    是否允许编译器删除 dynamic_cast 一起改变 nullptr;

    这个问题的原因是 answer .

    • 假设volatile意味着编译器不能假设 a ,因为它是不稳定的。这是一个 question 为什么?

    • 动态播放 可能不允许删除的是程序中可能有一个类型,它从这两者派生 A B .

    2 回复  |  直到 6 年前
        1
  •  2
  •   Yakk - Adam Nevraumont    6 年前

    对。 dynamic_cast 没有超出其返回值的可观察行为。

    编译器知道由指向的静态类型 a .

    事实上:

    struct A { virtual ~A() {} };
    struct B:A {};
    
    bool foo() {
      A* a = new A;
      return dynamic_cast<B*>(a);
    }
    

    上面的dynamic cast语句也可以优化为 return false; new 在没有整个程序优化的情况下不能忽略,因为有人可能会重载全局运算符new;一旦证明没有全局运算符new重载,它甚至可以优化调用 new A operator new ,也不会创建 A 也没有任何明显的副作用。

        2
  •  2
  •   bolov    6 年前

    dynamic_cast 按好像规则 (一) 当且仅当它能证明调用的唯一有效结果是 false . 很简单。

    . 您可以证明iff在整个程序中没有继承这两个的类 A B .


    (一) 动态播放