【问题标题】:Is llvm's dyn_cast still used as an alternative to dynamic_cast?llvm 的 dyn_cast 是否仍然用作 dynamic_cast 的替代品?
【发布时间】:2021-07-31 13:48:50
【问题描述】:

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

// 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 源代码 (here's a list of recent commits),您会看到使用了 dyn_cast。在 LLVM 源代码中使用,其类具有必要的管道。

标签: c++ casting c++17 llvm dynamic-cast


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 2019-11-28
    • 1970-01-01
    • 2017-03-25
    • 2019-08-20
    • 2013-01-29
    • 2011-01-19
    相关资源
    最近更新 更多