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_casttypeid

5. 相关编译选项

  • GCC/Clang-fno-rtti 关闭 RTTI,-frtti(默认)开启
  • MSVC/GR- 关闭 RTTI,/GR(默认)开启

6. 总结

  • RTTI 让你在运行时识别对象的真实类型,常用于多态场景。
  • 主要用法是 dynamic_casttypeid
  • 关闭 RTTI 可以减小体积、提升性能,但会失去类型识别能力。

posted @ 2025-07-14 15:24  AngDH  阅读(26)  评论(0)    收藏  举报