llvm 的 dyn_cast 是否仍然用作 dynamic_cast 的替代品?

Is llvm's dyn_cast still used as an alternative to dynamic_cast?

我正在尝试像这样优化一些代码:

// RequestType inherits MessageType 
void receive_message (MessageType* M) 
{
   auto msg = dynamic_cast<RequestType>(M);
   if (msg != nullptr) 
   {
       // do something
   }
}

程序直到运行时才知道具体类型MessageType

代码中,dynamic_cast重复使用,占用资源较多。所以我搜索了替代方案,LLVM 的 dyn_cast 出现了。从手册看来 dyn_cast 不使用 VMT,所以那样效率更高。

可是,我搜索它的用途时,似乎没有多少关于这个话题的?大多数问题都可以追溯到 2010 年代,所以我想知道它现在是否仍在使用,或者是否有更好的选择(例如 typeid,等等)/或者它没有被广泛使用是否有原因?

如果有人能阐明这一点,那就太好了。提前致谢!

虽然 LLVM 的 dyn_cast 模板是“另一种选择 dynamic_cast”,但它还要求用户实现 LLVM 的 RTTI,这在本文档中有详细描述:https://llvm.org/docs/ProgrammersManual.html#the-isa-cast-and-dyn-cast-templates

回答您的问题;是的,dyn_cast 和朋友今天仍然被 LLVM 使用。 LLVM 推出了自己的 RTTI 形式,因为它比标准提供的更快、更便宜,所以你做对了。

如果您决定走这条路,您可以参考 LLVM 文档了解如何实现 LLVM 风格的 RTTI:https://llvm.org/docs/HowToSetUpLLVMStyleRTTI.html