【问题标题】:What are the disadvantages of dynamic_cast in C++?C++ 中 dynamic_cast 的缺点是什么?
【发布时间】:2014-05-02 18:00:26
【问题描述】:

尽管dynamic_cast 返回一个0 如果正在处理的指针是不兼容的类型,你为什么要避免使用dynamic_cast

【问题讨论】:

  • 因为如果给出参考它会引发错误。

标签: c++ types downcast


【解决方案1】:

它需要非零运行时间。就是这样。 C-casts 及其 c++ 对应部分(如:reinterpretstatic)的开销为 0,因为它们是在编译期间执行的。

对某些人来说,重要的部分可能是他们确实需要RTTI,这也引入了一些开销,例如代码大小,因为编译器必须将类型信息包含到二进制文件中,这通常不会这样做。请注意,这可能是编译器中的非标准选项。

还有来自 wiki 的相关注释:“在最初的 C++ 设计中,Bjarne Stroustrup 没有包含运行时类型信息,因为他认为这种机制经常被滥用。

编辑:关注报价和 cmets。我不确定这是否真的是一个缺点,我想指出,当你使用它时,你应该考虑一下你是否真的需要它。

有些人只是不喜欢它,有些人确实滥用它。

【讨论】:

  • 而且它要求所涉及的类是多态的。
  • 别忘了static_cast
  • 这表明你没有很好地使用多态性。
  • 但有些用例中 dynamic_cast 不能被 static_cast 或 reinterpret_cast 替换。这可能是也可能不是糟糕的设计,具体取决于您的意见(请参阅上面 wiki 中的 Bjarnes 引用)。
  • @TobiasLangner 我,或者他从未说过,这很糟糕。他不喜欢它,因为他认为人们会滥用它。我会把它比作卖或不卖刀。它们可以用于没有适当替代品的东西,也可以用于伤害他人或自己 =)。不过我不会禁止他们。我只想指出在这个话题上意见分歧很大。
【解决方案2】:

运行时开销:

  • 需要更多内存来存储 RTTI(请参阅 link)。
  • 必须在运行时检查类型。

设计问题:

  • 涉及的类型必须是多态的。
  • 通常表明您的代码中有其他错误;为什么需要检查?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2015-05-25
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多