C++运行时内省(Runtime Introspection)的内部工作机制是什么?
C++ 运行时内省(RTTI)底层实现原理
编译器生成RTTI的规则
C标准只定义了RTTI的能力边界,具体实现由编译器遵循对应平台的ABI规范决定,主流GCC/Clang遵循Itanium C ABI,MSVC有独立实现,核心逻辑一致:
- 编译器会为每一个C++类型生成全局唯一的
std::type_info实例,哪怕两个类型的内存布局、成员完全一致,只要是独立定义的类型,对应的std::type_info实例就是独立的。 - 只有多态类型(至少包含一个虚函数的类)才会把RTTI指针绑定到对象实例上,用于运行时动态类型识别;非多态类型的类型识别完全在编译期完成,不需要运行时访问RTTI。
- 你给出的两个示例类:
class TypeOne { std::string name; }; class TypeTwo { std::string name; };
哪怕成员完全一致,编译器也会为它们生成完全独立的std::type_info实例,内置的混淆类型名、内部标识都不相同。
RTTI的存储形式
RTTI信息不会随每个对象实例重复存储,存储结构如下:
- 所有
std::type_info实例都存放在进程的只读数据段,全局唯一,不会重复生成。 - 多态类型的每个实例内存起始位置会存储一个虚表指针(vptr),指向该类型的全局唯一虚表(vtable)。
- 虚表同样是存放在只读数据段的全局结构,除了存储所有虚函数的地址外,会预留一个固定偏移的槽位指向该类型对应的
std::type_info实例。 - 非多态类型的实例内存中不会存储任何和RTTI相关的信息,类型识别完全由编译器在编译期处理。
运行时RTTI的访问与比对逻辑
访问逻辑
- 静态类型识别:编译期直接确定对应的
std::type_info实例,不需要访问运行时数据。 - 动态类型识别:运行时从对象实例的vptr拿到虚表,再从虚表的固定偏移位置取出
std::type_info指针,完成RTTI访问。
比对逻辑
- 主流编译器的
std::type_info比对优先直接比对指针地址:因为每个类型的std::type_info是全局唯一的,只要两个type_info指针地址相同,就代表是同一个类型,比对性能极高。 - 部分跨模块场景下会 fallback 到比对
type_info中存储的混淆类型名字符串,性能相对较低。 - 对于你给出的两个结构完全一致的类,无论编译期还是运行时比对,都会因为对应的
std::type_info实例完全独立,直接判定为不同类型。
内容的提问来源于stack exchange,提问作者l000p
相关产品推荐
相关产品推荐

