没有 RTTI 但仍然是虚拟方法
No RTTI but still virtual methods
C++ 代码可以在禁用 运行 时间类型信息的情况下进行编译,这会禁用 dynamic_cast
。但是,虚拟(多态)方法仍然需要根据目标的 运行 时间类型进行调度。这是否意味着类型信息无论如何都存在,并且 dynamic_cast
应该能够始终工作?
禁用 RTTI 会终止 dynamic_cast
和 typeid
,但对虚拟功能没有影响。虚函数通过 类 的 "vtable" 调度,其中有任何虚函数;如果你想避免有一个 vtable 你可以简单地没有虚函数。
很多 C++ 代码在没有 dynamic_cast
的情况下也可以工作,几乎所有的 C++ 代码在没有 typeid
的情况下也可以工作,但相对较少的 C++ 应用程序可以在没有任何虚函数(或更多到点,他们期望虚拟的功能变成非虚拟的)。
虚拟 table (vtable) 只是指向所有虚函数的每个类型查找 table 的每个实例指针。您只需为使用的东西付费(Bjarne 喜欢这种理念,并且最初抵制 RTTI)。另一方面,使用完整的 RTTI,你最终会得到你的库和 executables 有相当多的精心制作的字符串和其他信息,用于描述每种类型的名称,也许还有其他事情,比如它们之间的层次关系类型。
我曾见过禁用 RTTI 的生产系统将 executables 的大小缩小了 50%。这主要是由于大量字符串名称最终出现在一些大量使用模板的 C++ 程序中。
C++ 代码可以在禁用 运行 时间类型信息的情况下进行编译,这会禁用 dynamic_cast
。但是,虚拟(多态)方法仍然需要根据目标的 运行 时间类型进行调度。这是否意味着类型信息无论如何都存在,并且 dynamic_cast
应该能够始终工作?
禁用 RTTI 会终止 dynamic_cast
和 typeid
,但对虚拟功能没有影响。虚函数通过 类 的 "vtable" 调度,其中有任何虚函数;如果你想避免有一个 vtable 你可以简单地没有虚函数。
很多 C++ 代码在没有 dynamic_cast
的情况下也可以工作,几乎所有的 C++ 代码在没有 typeid
的情况下也可以工作,但相对较少的 C++ 应用程序可以在没有任何虚函数(或更多到点,他们期望虚拟的功能变成非虚拟的)。
虚拟 table (vtable) 只是指向所有虚函数的每个类型查找 table 的每个实例指针。您只需为使用的东西付费(Bjarne 喜欢这种理念,并且最初抵制 RTTI)。另一方面,使用完整的 RTTI,你最终会得到你的库和 executables 有相当多的精心制作的字符串和其他信息,用于描述每种类型的名称,也许还有其他事情,比如它们之间的层次关系类型。
我曾见过禁用 RTTI 的生产系统将 executables 的大小缩小了 50%。这主要是由于大量字符串名称最终出现在一些大量使用模板的 C++ 程序中。