了解C++中的RTTI

CodeWarrior使用教程第三课:编译 第一步:理解编译阶段 我们的前面的课程中已经学到,源程序输入完之后的工作就是要编译它。编译源程序就是计算机把你所写(通常是用C 或 C++编写的)的源代码进行分解、分析,然后转化为机器语言。机器语言是一种计算机能够理解阿语言,而且它运行起来比 C 或 C++ 也要快得多。编译的大致过程如下: 1. 用 C 或 C++ 编写代码: #include void main(void) { int c; printf("Hello World on Windows!\n"); c... 阅读详情

    文章来源:http://www.cnblogs.com/xiaoyuer323/articles/180147.html

    RTTI(运行时类型信息),是所有RAD开发工具的基础。RTTI是比较新的编程语言提供的能力,C、Fortran、Basic就没有,而现在几乎所有现代的、可视化的编程语言都提供了RTTI功能。C++的标准中也对RTTI作了规定。但相对其它语言而言,C++的RTTI信息是最简单的。

      一、RTTI典型的应用需求
    1、类型的识别,即能在运行时判断出某对象、表达式等的类型,能判断它们是基本类型(int、string),还是对象,以及它们区别于其它类型的标识;
    2、对象的继承关系的运行时判断;
    3、在出错处理、内存诊断等处理时的输出信息;
    4、基于字符型名称的运行时对象访问、方法调用;
    5、对象的自动保存和读入;
    6、基于ID或名称的对象自动生成;
    7、环境配置的保存和读入;
    8、程序自动生成;

二、C++中RTTI的实现
    RTTI最直接的实现是通过编程语言的语法支持功能,由编译器自动完成,比如:Delphi等语言就提供了Property关键字。C++语言没有这些语法支持功能,因为C++不是一种RAD语言,可以将VB、Delphi、Java等与之进行对比。C++的RTTI是最简单的,只能获得类名和相关的继承信息;而VB、Delphi、Java等确复杂得多,甚至于支持属性名、方法名、事件名等。
    标准C++ 提供了typeid() 操作,以得到类型信息,它的参数可以是一个表达式,可以是一个对象、指针或者引用,通过这个方法,可以得到一个指向常type_info对象,里面包含了这个表达式的类型必要的信息。type_info对象提供的功能有如下这些:
    1、name(),可以得到一个包含类型信息的字符串,返回如:"int"、"MyClass"等;
    2、before(),用来在类型列表中遍历;
    3、==操作,用来判断类型是否相同;
    VC中的MFC提供的RTTI实现与C++提供的差不多,但是有一些功能上和实现在的差别,但也只是提供了名称和比较功能。
    不能说,这是C++或VC中的缺陷,这是由C++的定位决定了,如果C++加上了复杂的RTTI信息,则C++可能就变成了C#或别的什么语言了。是的,C#增加了比较复杂的RTTI信息,谁让他的主设计者就是从Borland公司过去的呢(这也决定了C++在.NET框架中的会被淘汰的命运,因为它在.NET中没有合适的定位,就象VF被淘汰一样)。
    
三、RTTI实现的要点
    作为一种语言的新特性,RTTI的实现,应有如下要求:
    1、必须满足特定语言的定位和要求,不能说,将所有可能的功能加进去就是好东西了;
    2、必须是尽可能透明的,RTTI的主要应用在IDE和底层,一般情况下,编程用户不需要了解过多的RTTI细节,比如:作为Delphi用户,他只需要基于属性的访问方法,只需要知道基于组件的保存方法,不需要了解RTTI在其中所起的作用,就象电视机的使用者不需要了解电视机的原理;
    3、尽可能轻便,不能因为实现RTTI要耗费大量内存和CPU时间,不能占用太大的程序空间,当然,这个要求是相对的,
    4、尽可能高效
    4、作为RTTI的实现者,应该尽可能在定义了功能集的情况下,以幽雅的方法实现之。
    C++中实现RTTI和执久化是通过宏来完成的,幽雅吗?算是吧。

四、关于几个库中RTTI实现的评价
    1、MFC,MFC实现了简单的,与标准C++有区别的RTTI,其实现是通过宏来完成的,同时通过宏来辅助用户完成执久化工作,但执久化
的具体细节要求用户完成。
    2、VCL,VCL实现了比较复杂的RTTI,具有关系继承、属性、方法、事件、基于属性的自动对象生成、强大的执久化功能;
    3、COM,COM通过类型库定义其RTTI,比VCL还要复杂。
    4、QT, QT中实现的RTTI也是比较复杂的,值得说明的是,它提供了一种特别的扩展方法,在编译前,必须将其RTTI信息转换为标准C++语言,个人认为,这是一种不好的方法,虽然我对QT库的评价非常高。特别是它提供的富有特色的CANVAS功能(写到这里,想起以前使用 Oracle的扩展C语言时的痛苦)。
    5、WXWINDOW,实现的是比较简单的RTTI。
    6、VCF,实现了我所看到的在C++中最全面的RTTI功能,但其性能是一个大问题。
    7、OOPS,实现了我所看到的在C++中对象执久化全好的解决方案,但它的扩充性不好在已有标准库的基础上能很好地完成工作,但在增加第三方库的时侯就痛苦了(对了,OOPS中有一篇文章,对RTTI的需求进行了定义,写得非常好http://www.rcs.hu/Articles/RTTI_Part1.htm)。

12.1:C++运行时类型识别的概念和原理!(课程共5250字,5段代码举例) 综上所述,RTTI 是 C++ 中一个非常有用的特性,它可以让程序更加灵活地处理对象,同时也方便了程序员进行调试和错误处理。在使用 RTTI 时需要注意一些细节和局限性,以确保程序的正确性和稳定性,同时也需要考虑 RTTI 对程序性能和封装性的影响。 阅读详情

相关推荐

小米万兆路由器里的Docker安装可道云(Kodexplorer)私有网盘

小米2022年12月份发布了万兆路由器,里面可以使用Docker。 今天尝试在小米的万兆路由器里安装[可道云](http://kodcloud.com/)(Kodexplorer)私有网盘。

engchina的专栏 1万+

QT RTTI 运行时类型识别技术

QT 运算时类型识别技术介绍

m0_45074715的博客 1026

RocketMq面板访问异常 com.alibaba.fastjson.JSONException: not close json text, token : string

rocketmq JSONException: not close json text, token : string 问题解决

qq_21067307的博客 5573

QT 中的元对象系统

作为一名十几年的 C++ 程序员,最近一段时间使用 QT 开发程序,发现 QT 中还是有许多值得深入理解的技术。QT 不仅仅是一个应用程序开发框架,还有一些对标准 C++ 的扩充。本文和大家一起探讨 QT 中的元对象系统。在分析 QT 中的元对象系统之前,我们先回顾一下 C++ 中的 RTTI 机制。C++的RTTI机制RTTI 是 Runtime Type Identification 的缩写,...

云水木石 1171

【STM32】BLDC驱动&控制开发笔记 | 07_SPI通信测试 - STM32F407用SPI配置DRV8323驱动芯片

使用STM32F407的SPI通信功能配置DRV8323S驱动芯片的详细过程说明。

这里是 F菌的进阶之路。 6290

vhr 微人事系统安装与部署教程(SpringBoot + Vue 项目实战)

vhr(微人事)是一个开源的人力资源管理系统项目。系统采用前后端分离架构,主要技术栈包括:后端:MyBatis前端:VueElement UIAxios数据库:MySQL系统通常包含以下模块:员工管理部门管理职位管理薪资管理权限管理系统管理整体功能已经接近企业级后台系统。vhr(微人事)是一个非常经典的开源人力资源管理系统项目,基于SpringBoot + Vue 前后端分离架构。系统包含:员工管理部门管理权限管理薪资管理。

m0_69484557的博客 486

关于C++中RTTI的思考

RTTI(运行时类型信息),是所有RAD开发工具的基础。 这段时间,因为需要在自己的软件中加入扩展的RTTI功能,于是专门对RTTI进行了研究,现在一些心得写下来。  RTTI是比较新的编程语言提供的能力,C、Fortran、Basic就没有,而现在几乎所有现代的、可视化的编程语言都提供了RTTI功能。C++的标准中也对RTTI作了规定。但相对其它语言而言,C++的RTTI信息是最简单的。 一、R...

weixin_30474613的博客 157

深入解析FPGA中的GTX高速收发器架构与设计原理

本文深入解析了FPGA中GTX高速收发器的核心架构与设计原理。文章将GTX比作数据“高速公路”,详细拆解了其PMA(物理媒介适配层)与PCS(物理编码子层)的双层结构,阐述了串并转换、时钟恢复等关键技术,并提供了时钟源选型(QPLL/CPLL)、上电复位流程及信号完整性调试等实战指南,是掌握高速接口设计的必备知识。

f6g7h8i9j的博客 219

C++之RTTI实现原理

C++的RTTI为程序员提供了在运行时获取类型信息的便利,但在某些情况下,特别是涉及性能要求高的应用中,开发者可能需要权衡使用默认RTTI机制的开销,并考虑是否需要自定义实现以满足特定需求。自定义实现RTTI可以提供更灵活和高效的类型信息管理方式。我们设计RTTI时,基本上是通过宏的方式载入一些虚函数或者类型来处理一个class,在运行时识别到具体类型,就可以通过static_cast来进行安全转换。

红军不怕远征难,万水千山只等闲 3295

2025年最新雷电模拟器9.22安装Magisk面具和LSPosed框架完整图文教程 文章末尾附所需软件下载

操作环境:雷电模拟器9.0.22 虚拟系统版本android 91、设置-其他设置-Root权限-开启2、设置-性能设置-System.vmdk可写入3、安装Magisk-18a0b94a-delta(25205).apk,运行并给予root权限4、选择右上角安装弹出“允许“magisk Delta”访问您设备上的照片、媒体内容和文件吗?“选择允许,然后结束magisk进程。5、从新运行magisk选择右上角安装-选择修补boot镜像中的vbmeta和安装到Recovery。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 7102

【笔记篇】Davinci Configurator OS模块(下)

AUTOSAR OS的配置项和Vevtor MICROSAR OS的特性

weixin_47571898的博客 1157

Qt核心剖析: moc

前面我们说过,Qt 不是使用的“标准的” C++ 语言,而是对其进行了一定程度的“扩展”。这里我们从Qt新增加的关键字就可以看出来:signals、slots 或者 emit。所以有人会觉得 Qt 的程序编译速度慢,这主要是因为在 Qt 将源代码交给标准 C++ 编译器,如 gcc 之前,需要事先将这些扩展的语法去除掉。完成这一操作的就是 moc。 moc 全称是 Meta...

weixin_34129696的博客 1039

Windows 11 安装 uv:手动下载、配置国内源

本教程详细介绍了在 Windows 11 系统下安装并配置 Python 包管理器 uv 的完整流程,包括配置环境变量 PATH、设置清华 PyPI 镜像源,以及创建收据文件以支持未来更新。适用于因网络限制无法通过官方脚本自动安装的用户,操作步骤清晰,配有图文指引,帮助读者高效完成本地部署。

寒水馨 · 轻量级技术文档 · hanshuixin.org 7609

《你真的了解C++吗》No.026:运行时类型识别(RTTI)的开销——内存实相与寻址算法

RTTI是 C++ 为了在强类型系统中保留动态灵活性而付出的代价。不是简单的逻辑判断,而是一次深度的内存寻址与路径搜索。了解了其背后的type_info结构,你就理解了为什么它只能作用于多态对象。聊完了运行时的类型博弈,我们要回到代码编写时的权力控制。为什么protected在 C++ 中被认为是一个“危险”的折中?➡️《你真的了解C++吗》No.027:访问权限:不仅仅是访问控制——受保护成员的语义陷阱。

腾TO的技术博客 558

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

BCB中的RTTI机制

BCB中的RTTI机制 void __fastcall TForm1::Button2Click(TObject *Sender) { if (GetPropInfo(Button2, "Caption"))   Caption = GetPropValue(Button2, "Caption"); } RTTI在BCB中其实有两个意义。首先,针对一般标准的C++中所定义的

ksrsoft的专栏 1523

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

RTTI 运行时类型检查 虚函数

在C++层面主要体现在dynamic_cast和typeid,VS中虚函数表的-1位置存放了指向type_info的指针。对于存在虚函数的类型,typeid和dynamic_cast都会去查询type_info RTTI即运行时类型识别,用来识别动态对象的类型。即使我们仅仅有基类的指针和引用,可以识别出该指针和引用所指向那个类(基类或派生类)。RTTI会带来一定的性能开销。 RTTI 运行时类型识...

qq_41007781的博客 326

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

在运行时确定对象类型(RTTI)

http://blog.youkuaiyun.com/joyney/article/details/4235763c++中RTTI的观念和使用

a19576的专栏 535

c++RTTI总结

RTTI概述 运行时类型识别,RTTI能够通过基类指针或引用检索该指针指向的对象的实际类型。 typeid运算符 typeid能够获得一个表达式的类型。 以下代码展示了typeid在解析多态类型时的行为。 Derived *pd = new Derived; Base *pb = pd; cout << typeid(pb).name() << endl; //prints "class Base *" cout << typeid(*pb).name

pwjworks的博客 150

C++四大扩展之RTTI(运行时类型识别)

  运行时类型识别(Run-time type identification , RTTI),是指在只有一个指向基类的指针或引用时,确定所指对象的准确类型的操作。其常被说成是C++的四大扩展之一(其他三个为异常、模板和名字空间)。 使用RTTI的两种方法:   1、typeid()   第一种就像sizeof(),它看上像一个函数,但实际上它是由编译器实现的。typeid()带有一个参数...

CG-SpatialAI 256

More Effective C++之效率Efficiency_下

虚函数真正的运行时期成本发生在和inlining互动的时候。有时候我们的确会有正当的理由回避编译器所产生的服务,例如隐藏的vptrs及“指向virtual base classes”的指针,可能会造成“将C++对象存储于数据库”或“进程(process)边界间搬移C++对象”时的困难难度提高,所以我们可能会希望以某种方式模拟这些性质,使C++对象较易完成其他工作。程序中的每一个class凡声明(或集成)虚函数这,都有自己的一个vtbl,而其中条目(entries)就是该class的各个虚函数实现体的指针。

chnming1987的博客 820

[转]http://blog.quarkslab.com/visual-c-rtti-inspection.html

[转]http://blog.quarkslab.com/visual-c-rtti-inspection.html dynamic_cast implementation: http://wyfeizj.wordpress.com/2011/03/25/the-rtti-implementation-of-vs2010/ http://www.openrce.org/artic...

weixin_30466039的博客 107

推荐几篇好的文章

  http://www.cppblog.com/nacci/category/1784.html   首先是几篇关于MFC的文章:MFC的RTTI介绍和动态创建,MFC的消息映射和驱动等 还有关于C++的文章: 浅析C++ Compile-time Assertion技术 推荐有兴趣的可以看看,在这里感谢作者分享的知识!

WinLin 665

基础篇 | 13 C++ 编程入门(六)类型转换

C++是强类型语言,任何变量都必须有类型的,C++当中的类型转换比Java或C#都要复杂的多。大概包括以下四种转换: 1.动态类型转换 dynamic cast 2.隐式转换 static cast 3.强制转换 reinterpret cast 4.const转换 const cast 这四种转换用好对C++编程是非常有帮助的,也是C++类型系统当...

LorneNote 316

【读书笔记:C++ primer plus 第六版 中文版】第15章 友元、异常和其他

转载请注明出处:本章内容包括: 友元类 友元类方法 嵌套类 引发异常,try块和catch块 异常类 运行阶段类型识别(RTTI) dynamic_cast和typeid static_cast,const_cast和reiterpret_cast RTTI是一种确定对象类型的机制.新的类型转换运算符提高了类型转换的安全性.15.1 友元 也可以将类作为友元,在这种情况下,友元类的所有方法都可以访问

enyusmile 1367

理解C++的RTTI

C++的RTTI包含三部分内容:dynamic_cast, typeid和type_info(很少直接使用,但是需要了解一下,type_info的定义是由编译器定的,但是共同的是它包含一个name()函数)。   #include #include using namespace std; class Base1 { }; class Derive1 : p

imxiangzi的专栏 404

腾讯游戏unity客户端面试题

1.ugui优化方法: 可以参考我另一篇文章: https://blog.youkuaiyun.com/qq_17347313/article/details/99640957 2.lua string原理: 参考我的lua数据结构分析文章: https://blog.youkuaiyun.com/qq_17347313/article/details/100698348 3.c# string原理: 参考...

qq_17347313的博客 1万+
上一篇: C++虚继承:virtual public CParent
下一篇: C++中的public,protected, private
sdudubing
博客等级 码龄16年 117粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值