type_info是如何实现的
How is type_info implemented
大多数 c++ STL classes 都有易于理解的实现。但是,type_info
class 令人困惑。某些代码如何知道 class 的信息?
理论 1:
我的第一个理论是 type_info
class 从编译器获取信息(这意味着 STL 与编译器有一些集成)。
理论 2:
也可能是一些我不知道的晦涩的c++语法,但我不太确定这个理论。
type_info
只是一个提供类型信息的标准库 class。此 class 的对象由 typeid
运算符返回。
最感兴趣的不是 class 本身,而是 RTTI(运行-时间类型识别)的实现。这是一个纯粹依赖于编译器的特性,是 ABI(应用程序二进制接口)的一部分。
简而言之,编译器存储每个多态类型的类型信息及其 vtable 或 VMT(虚拟方法 Table).此信息是按类型而非按对象提供的,由 typeid
和 dynamic_cast
使用。 type_info
class 只是提供给最终用户的接口,它有一个内部实现取决于编译器。
不同的编译器实现不同的 ABI。现代 gcc 和 clang 编译器实现 Itanium C++ ABI,它描述了 RTTI 和其他部分的所有细节。 Microsoft Visual C++ ABI 未记录。
一篇描述 C++ vtable 并涵盖 RTTI 的好文章:Shahar Mike - C++ vtables。
大多数 c++ STL classes 都有易于理解的实现。但是,type_info
class 令人困惑。某些代码如何知道 class 的信息?
理论 1:
我的第一个理论是 type_info
class 从编译器获取信息(这意味着 STL 与编译器有一些集成)。
理论 2:
也可能是一些我不知道的晦涩的c++语法,但我不太确定这个理论。
type_info
只是一个提供类型信息的标准库 class。此 class 的对象由 typeid
运算符返回。
最感兴趣的不是 class 本身,而是 RTTI(运行-时间类型识别)的实现。这是一个纯粹依赖于编译器的特性,是 ABI(应用程序二进制接口)的一部分。
简而言之,编译器存储每个多态类型的类型信息及其 vtable 或 VMT(虚拟方法 Table).此信息是按类型而非按对象提供的,由 typeid
和 dynamic_cast
使用。 type_info
class 只是提供给最终用户的接口,它有一个内部实现取决于编译器。
不同的编译器实现不同的 ABI。现代 gcc 和 clang 编译器实现 Itanium C++ ABI,它描述了 RTTI 和其他部分的所有细节。 Microsoft Visual C++ ABI 未记录。
一篇描述 C++ vtable 并涵盖 RTTI 的好文章:Shahar Mike - C++ vtables。