RTTI
RTTI(Run-Time Type Information)详解
1. 什么是 RTTI?
RTTI(运行时类型信息,Run-Time Type Information)是 C++ 提供的一种机制,允许程序在运行时获取对象的实际类型信息。
它主要用于多态(即基类指针/引用指向派生类对象)场景下,判断和操作对象的真实类型。
2. RTTI 能做什么?
- 类型识别:判断一个基类指针/引用实际指向的是什么派生类对象。
- 安全类型转换:通过
dynamic_cast
安全地将基类指针/引用转换为派生类指针/引用。 - 类型信息获取:通过
typeid
获取对象的类型信息。
3. RTTI 的常用用法
3.1 dynamic_cast
用于多态类型之间的安全转换。如果转换失败,返回 nullptr
(指针)或抛出异常(引用)。
class Base { virtual void foo() {} };
class Derived : public Base {};
Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b); // 成功,d 不为 nullptr
3.2 typeid
用于获取对象的类型信息(返回 type_info
对象)。
#include <typeinfo>
Base* b = new Derived();
std::cout << typeid(*b).name() << std::endl; // 输出 Derived 的类型名
4. RTTI 的开销与关闭
- 开销:启用 RTTI 会让每个多态类多出一些类型信息,导致可执行文件稍大,运行时有微小性能损耗。
- 关闭 RTTI:有些项目(如嵌入式、对体积/性能极致要求)会通过编译选项关闭 RTTI(如
-fno-rtti
),此时不能用dynamic_cast
和typeid
。
5. 相关编译选项
- GCC/Clang:
-fno-rtti
关闭 RTTI,-frtti
(默认)开启 - MSVC:
/GR-
关闭 RTTI,/GR
(默认)开启
6. 总结
- RTTI 让你在运行时识别对象的真实类型,常用于多态场景。
- 主要用法是
dynamic_cast
和typeid
。 - 关闭 RTTI 可以减小体积、提升性能,但会失去类型识别能力。