可以使用禁用的运行时类型信息编译C++代码,这会禁用dynamic_cast
.但是,仍然需要根据目标的运行时类型调度虚拟(多态)方法.这是否意味着类型信息无论如何dynamic_cast
都应该存在,并且应该能够始终工作?
禁用RTTI杀死dynamic_cast
和typeid
,但对虚拟功能没有任何影响.通过具有任何虚函数的类的"vtable"调度虚函数; 如果你想避免使用vtable,你可以简单地没有虚函数.
野外的大量C++代码可以在没有dynamic_cast
它的情况下工作typeid
,而且几乎所有的C++代码都可以不用,但是相对较少的C++应用程序可以在没有任何虚拟功能的情况下生存(或者更重要的是,他们希望虚拟化的功能变为非虚拟功能).
虚拟表(vtable)只是指向所有虚函数的每类型查找表的每实例指针.你只需支付你使用的费用(Bjarne喜欢这种理念,最初抵制RTTI).另一方面,如果使用完整的RTTI,您最终会得到具有大量精心设计的字符串和其他信息的库和可执行文件,以描述每种类型的名称以及类似类型之间的层次关系等其他内容.
我见过禁用RTTI的生产系统将可执行文件的大小缩小了50%.大多数情况是由于大量字符串名称最终导致某些C++程序大量使用模板.