补一张总图,dynamic_cast 的性能测试差不多就搞到这里。最近搞的一个项目里面可能会存在大量 dynamic_cast,因此想知道 dynamic_cast 的性能开销究竟有多大。
libcxxabi 的 dynamic_cast 实现还是十年前的初代版本,在热路径上都还有明显的可优化的点,不知道为啥一直没人搞,大概是因为没人用 libc++ 吧(悲
说一下图里面各个 benchmark 的含义:
-
-
-
-
-
-
libcxxabi 的 dynamic_cast 实现还是十年前的初代版本,在热路径上都还有明显的可优化的点,不知道为啥一直没人搞,大概是因为没人用 libc++ 吧(悲
说一下图里面各个 benchmark 的含义:
-
Chain [middle | fail] <X levels>
:继承关系构成一根单链,没有虚继承;执行向下转换,转换的层数由 X 给出;如果存在 middle 字样,说明转换的目标类型不是对象的动态类型;如果存在 fail 字样,说明转换失败。-
Vchain [middle | fail] <X levels>
:继承关系构成一根单链,所有继承关系都是虚继承;middle 、fail 和 X 的含义与 chain 相同。-
DAG [middle | sidecast | fail] <X levels>
:继承关系构成一个 DAG,没有虚继承;如果存在 middle 字样,说明转换到的目标类型不是对象的动态类型;如果存在 sidecast 字样,则执行侧向转换,否则执行向下转换,转换的层数由 X 给出;如果存在 fail 字样,说明转换失败。-
VDAG [middle | sidecast | fail] <X levels>
:继承关系构成一个 DAG,所有继承关系都是虚继承;middle、sidecast 、fail 以及 X 的含义与 DAG 相同。-
cast to complete
:使用 dynamic_cast<void*>
将基类子对象指针转换为完整对象指针。-
Static cast
:使用 static_cast
执行不带运行时类型检查的向下转换。