"RTTI的机制及花费-learning ros for robotics programming - second edition"
在C++中,运行时类型信息(RTTI,Runtime Type Information)是一种允许程序在运行时查询对象的确切类型的能力。RTTI主要由两个关键操作支持:`typeid`表达式和`dynamic_cast`运算符。
1. `typeid`表达式:
`typeid`用于获取对象或引用的类型信息。当应用于一个对象或引用时,它返回一个`type_info`对象的引用,该对象包含了类型名称和其他元数据。如果应用于一个非聚合类型的指针,且该指针为NULL或指向了一个基类,`typeid`会抛出`std::bad_cast`异常。在VTA(Virtual Table)中存放的额外指针使得RTTI能够获取类的`type_info`结构。
2. `dynamic_cast`运算符:
`dynamic_cast`是C++中用于安全类型转换的关键字,特别是在处理多态性时。它允许在运行时将一个指针或引用从一个基类类型转换为目标派生类类型。如果转换是安全的,`dynamic_cast`返回转换后的指针或引用;如果转换失败,它会返回NULL(对于指针)或引发`std::bad_cast`异常(对于引用)。在处理多继承时,`dynamic_cast`需要考虑类层次结构,可能需要调整指针以指向正确的基类子对象。
RTTI的开销:
RTTI的使用虽然提供了灵活性,但也会带来一定的性能成本。首先,每个具有虚函数的类都需要在VTABLE中存储额外的指针,这增加了内存消耗。其次,`typeid`和`dynamic_cast`操作在运行时需要查找和比较`type_info`结构,这可能导致CPU周期的增加。因此,除非确实需要运行时类型检查,否则应谨慎使用RTTI,因为它可能会降低代码的运行效率。
面向对象程序设计(OOP)的基本概念:
- **对象**:对象是类的实例,具有特定的状态(数据成员)和行为(成员函数)。
- **类**:类是对象的蓝图,定义了对象的属性和操作。类可以看作是自定义的数据类型。
- **封装**:封装是将数据和操作数据的方法绑定在一起,形成一个独立的实体,对外界隐藏内部实现细节。
- **继承**:继承允许一个类(子类)从另一个类(基类)继承属性和行为,实现代码重用。
- **多态**:多态是指同一种行为可以有不同的表现形式,通常通过虚函数实现。
OOP方法强调代码的组织和设计,以反映现实世界中的问题域,从而提高代码的可读性、可维护性和可扩展性。在C++中,OOP与泛型编程、模板、STL等特性相结合,构建了强大的编程范式。