LLVM拥有自己的RTTI替代方案,这是对内置RTTI的速度提升,允许动态转换为没有vtable(dyn_cast)的类。但是,它仍然可以完全按照dynamic_cast<>的使用方式使用,尽管它允许它与更多的类一起使用。

dyn_cast<>模板文档

LLVM是一个声誉良好的C ++项目,所以这似乎是在面对一个普遍的说法,即过多的动态转换是设计糟糕的标志,也称为代码气味。当然,性能更好的动态模型无法改善其在设计中的使用,而不是标准dynamic_cast。那么谁在这里?在C ++代码中,是否存在大规模使用动态铸造是一个很好的设计选择的情况?谷歌在LLVM中继源代码中出现了690次这种动态转换。

其他提示

我认为动态演员阵容很糟糕不是因为它们很慢,而是因为它们暗示你的代码太紧密了。

我只是在LLVM文档中快速查看了dyn_cast和isa的实现。

代码中的例子如下:

struct bar {
  bar() {}
private:
  bar(const bar &);

};
struct foo {
  void ext() const;
  /*  static bool classof(const bar *X) {
    cerr << "Classof: " << X << "\n";
    return true;
    }*/
};

template <> inline bool isa_impl<foo,bar>(const bar &Val) {
  errs() << "Classof: " << &Val << "\n";
  return true;
}

使用B调用测试并具有:

if (!isa<foo>(B1)) return;
if (!isa<foo>(B2)) return;

如果我理解正确的是什么,isa模板(由dyn_cast使用)使用isa_impl的显式特化来链接bar与foo。在给出的示例中,似乎isa<foo>(B1)返回true!

无论如何,这与dynamic_cast的行为完全不同,所以我真的不认为你可以将它们相互比较。

显然,我可能会误解LLVM正在做什么,所以如果我不理解代码,请告诉我!

scroll top