【发布时间】:2013-09-14 21:08:10
【问题描述】:
正如标题所示,我正在寻找一种快速的运行时类型检查方法。为了说明我的问题,假设您有一个如下所示的类层次结构:
Base
/ \
A D
/ \ / \
C B F E
\ /
G
我的程序将任何类的所有实例保存在一个列表中作为 Base_ptr,因为所有这些类都共享共同的任务。现在在某些时候,一些派生类需要知道另一个类的实例的存在。到目前为止一切顺利,我知道 dynamic_cast 和 typeid()-operator,但两者都有一些主要的缺点:
- 如果类型不兼容,dynamic_cast 会消耗大量处理时间(例如,尝试将 E 实例强制转换为 C)
- typeid() 在“isTypeOrSubtype”情况下不起作用,例如您需要 D 的所有实例或从 D 派生的实例(因此 Es、Fs 和 Gs 也是如此)
如果此测试成功返回,理想的解决方案将是某种“isTypeOrSubtype”测试并且仅进行强制转换。我有一个自己的方法,其中包含一些宏定义和预先计算的类名哈希,但它非常丑陋且难以维护。所以我正在寻找一种更干净、更快速的动态类型和子类型检查方法,每秒可以检查超过 2000 万次。
【问题讨论】:
-
如果您真的“正在寻找一种更清洁、更快速的动态类型和子类型检查方法,每秒可以检查超过 2000 万次”,那么您真的应该重新考虑您的设计!需要高性能类型信息检查的设计很糟糕。
-
这可能是一个误解,因为我不打算经常检查。我确实需要某种测量来比较不同的方法,所以如果我通过让它们运行相同的测试并同时测量 10m 案例所花费的时间来比较两个或多个不同的设计。它需要执行得那么快,以免在某些类使用类型检查的情况下减慢其他组件的速度。
-
所以,您“不打算经常检查”,而是“它需要执行得那么快,这样才不会减慢其他组件的速度……”?这仍然是相同的消息!我仍然建议您重新考虑您的设计并尽量避免使用 RTTI。
-
如果你的程序基于运行时类型检查来执行业务逻辑,那么你就走错了方向。
-
如果不在乎,为什么还要检查?
标签: c++ rtti typechecking