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 。
标签: 无标签
已有 11 条评论
9月23日
不错不错,我喜欢看 https://www.jiwenlaw.com/
回复
9月27日
怎么收藏这篇文章?
回复
9月27日
怎么收藏这篇文章?
回复
10月1日
想想你的文章写的特别好https://www.237fa.com/
回复
10月4日
看的我热血沸腾啊https://www.ea55.com/
回复
10月4日
不错不错,我喜欢看 https://www.ea55.com/
回复
10月5日
不错不错,我喜欢看 www.jiwenlaw.com
回复
10月19日
哈哈哈,写的太好了https://www.cscnn.com/
回复
10月19日
文章的确不错啊https://www.cscnn.com/
回复
11月14日
真好呢
回复
4天前
你的文章内容非常用心,让人感动。 https://www.4006400989.com/qyvideo/93576.html
回复