没有RTTI但仍然是虚拟方法

时间:2015-12-18 10:43:25

标签: c++ polymorphism rtti

可以在禁用运行时类型信息的情况下编译C ++代码,这会禁用dynamic_cast。但是,仍然需要根据目标的运行时类型调度虚拟(多态)方法。这是否意味着类型信息无论如何都存在,dynamic_cast应该能够始终有效?

1 个答案:

答案 0 :(得分:20)

禁用RTTI会导致dynamic_casttypeid失效,但对虚拟功能没有影响。虚拟功能通过" vtable"具有任何虚函数的类;如果你想避免使用vtable,你根本就没有虚函数。

野外的大量C ++代码可以在没有dynamic_cast的情况下工作,并且几乎所有C ++代码都可以在没有typeid的情况下工作,但相对较少的C ++应用程序可以在没有任何虚函数的情况下生存(或者更重要的是,他们期望虚拟变为非虚拟的功能。

虚拟表(vtable)只是指向所有虚函数的每类型查找表的每实例指针。你只需支付你使用的费用(Bjarne喜欢这种理念,最初抵制RTTI)。另一方面,使用完整的RTTI,您最终会得到包含大量精心设计的字符串和其他信息的库和可执行文件,以描述每种类型的名称以及其他类似的类型之间的层次关系。

我见过禁用RTTI的生产系统将可执行文件的大小缩小了50%。其中大部分原因是由于大量的字符串名称最终导致某些C ++程序使用了大量的模板。