RTTI、反射

前言

  说实话,弄清楚这几个概念花了我很长的时间。但是弄清楚这几个概念是非常有必要的,这篇文章是我对这几个概念的总结。

RTTI

  RTTI的英文全称是"Runtime Type Identification",它指的是程序在运行的时候才确定需要用到的对象是什么类型的。直观一点来看,举个例子:目前有一个方法可能返回不同类的实例,如何确定返回的到底是什么类呢?这就是所谓的运行的时候才确定类型,也就是所谓的动态多态。在 C++ 中通过 typeid 和 dynamic_cast 实现了 RTTI。

  与动态多态相对应的就是静态多态。在 C++ 里静态多态一般指的是用模版和重载,在编译时就能确定对象类型的多态方法。

  RTTI 一般用于确定返回不同的派生类时具体是哪个类。

反射

  反射(Reflection)在 Wikipedia 上的定义是:"In computer science, reflection is the ability of a process to examine, introspect, and modify its own structure and behavior"。换而言之,反射赋予某个进程在运行的过程中检查和修改进程本身的功能。

  一段程序被编译之后生成的二进制可执行文件在被执行的过程中会被载入到内存的 text 段中,一般来说 text 段是只读的,这也就意味着程序所有的行为会在编译时确定,一旦编译完成就不会更改。然而具体而言,反射提供了让程序在运行时获取类的完整结构信息、创建类、修改类成员变量、调用类方法等等一系列功能。简而言之,通过这一系列的功能,程序能够在运行过程中更为灵活地根据自身需要动态载入、调用各种类。

  Java、C#、Go 等语言已经在语言层面支持了反射特性,而 C++ 这种较为保守的语言要使用反射特性就得通过一些奇淫技巧了,而且因为 C++ 没有在语言层面提供返回类的 metadata 的能力,所以很多属性要靠手动注册,这里可以参考RTTR的实现:https://github.com/rttrorg/rttr

评论卡