C++RTTI(运行时类型识别)介绍

介绍

RTTI(Run-Time Type Information)是C++中的一个重要特性,它允许在运行时获取类型信息。

RTTI提供了两个主要的操作:dynamic_casttypeid。这些操作在运行时检查类型,允许我们在运行时决定如何处理对象。

dynamic_cast

dynamic_cast主要用于进行安全的类继承体系中的向下转型和侧向转型。如果转换不可能进行,它会返回空指针(对于指针类型)或者抛出一个异常(对于引用类型)。

Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b);  // d points to a Derived
if (d != nullptr) {// The cast is safe, so we can use d
}
typeid

typeid返回一个type_info对象,这个对象封装了关于数据类型的信息。你可以使用type_infoname()成员函数来获取类型的名字,或者使用type_infobefore()hash_code()成员函数来对类型进行比较。

Base* b = new Derived();
const type_info& t = typeid(*b);
cout << "b points to an instance of " << t.name() << '\n';

type_info对象定义代码

class type_info {
public:#if _HAS_CPP0Xsize_t hash_code() const _THROW0(){	// hash name() to size_t value by pseudorandomizing transformconst char *_Keyval = name();size_t _Val = 2166136261U;size_t _First = 0;size_t _Last = _CSTD strlen(_Keyval);size_t _Stride = 1 + _Last / 10;for(; _First < _Last; _First += _Stride)_Val = 16777619U * _Val ^ (size_t)_Keyval[_First];return (_Val);}#endif /* _HAS_CPP0X */#ifdef _M_CEE[System::Security::SecurityCritical]#endifvirtual ~type_info();_CRTIMP_PURE bool __CLR_OR_THIS_CALL operator==(const type_info& _Rhs) const;_CRTIMP_PURE bool __CLR_OR_THIS_CALL operator!=(const type_info& _Rhs) const;_CRTIMP_PURE int __CLR_OR_THIS_CALL before(const type_info& _Rhs) const;_CRTIMP_PURE const char* __CLR_OR_THIS_CALL name(__type_info_node* __ptype_info_node = &__type_info_root_node) const;_CRTIMP_PURE const char* __CLR_OR_THIS_CALL raw_name() const;
private:void *_M_data;char _M_d_name[1];__CLR_OR_THIS_CALL type_info(const type_info& _Rhs);type_info& __CLR_OR_THIS_CALL operator=(const type_info& _Rhs);_CRTIMP_PURE static const char *__CLRCALL_OR_CDECL _Name_base(const type_info *,__type_info_node* __ptype_info_node);_CRTIMP_PURE static void __CLRCALL_OR_CDECL _Type_info_dtor(type_info *);
};

总结

RTTI可能会增加程序的运行时开销,并且在某些情况下(例如,当你有严格的性能要求,或者你正在编写需要尽可能减少内存使用的嵌入式代码时),你可能需要禁用它。在编译C++代码时,可以通过编译器选项来禁用RTTI。在g++和clang++中,这个选项是-fno-rtti。虽然RTTI是一个强大的工具,它使得C++更加灵活,但是也需要谨慎使用,以防止滥用带来的性能问题和设计复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iframe postMessage 通信

嵌入 iframe <iframesrc"/model/index.html"id"modelIframe"name"modelIframe"frameborder"0"></iframe>发送信息 let modelIframe: any;// 初始化 document.getElementById(modelIframe).onload function () {modelIfr…

Spark作业提交原理

1.6 Spark作业提交原理 Spark作业&#xff08;任务&#xff09;提交就是使用spark中spark-sumbit命令将已经封装好成jar包的程序提交到spark集群中执行运行从而得到计算结果的过程&#xff0c;在提交过程中我们对提交的作业&#xff08;任务&#xff09;进行参数设置操作 spa…

SAP ABAP给销售订单添加抬头、行项目文本

SAP ABAP给销售订单添加抬头、行项目文本 第一步&#xff1a;创建文本ID 1&#xff0c;通过SE75&#xff0c;新键文本对象的文本ID 2&#xff0c;2 &#xff0c;找到对象VBBK 销售 标题文件 3&#xff0c;点击文本IDS 4&#xff0c;进去后新建文本ID 第二步&#xff1a;通过…

使用Visual Studio(VS)创建空项目的Win32桌面应用程序【main函数入口变WinMain】

前言 在Visual Studio中直接新建Windows桌面应用程序会有很多多余的代码生成&#xff0c;本文将提供从空项目创建Win32项目的方法&#xff0c;解决新建空项目直接使用WinMain代码编译报错的问题 例如&#xff1a;LNK2019 &#xff1a;无法解析的外部符号 参考博客&#xff1…

ChibiOS简介4/5

ChibiOS简介4/5 1. 源由2. ChibiOS基础知识4/52.13 Chapter 13 - RT Synchronous Messages2.13.1 Basic concepts2.13.2 APIs 2.14 Chapter 14 - RT Events2.14.1 Basic concepts2.14.1.1 Events2.14.1.2 Operations 2.14.2 APIs 2.15 Chapter 15 - RT Debug2.15.1 Compile Tim…

【PTA刷题】堆栈模拟队列代码+详解

文章目录 题目C代码详解 题目 设已知有两个堆栈S1和S2&#xff0c;请用这两个堆栈模拟出一个队列Q。 所谓用堆栈模拟队列&#xff0c;实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S)&#xff1a;判断堆栈S是否已满&#xff0c;返回1或0&#xff1b;int IsEmpty (S…

without explicit opt-in, is unsupported. Switch Maven repository ‘maven8

Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository maven8 大概意思是 不支持对存储库使用不安全的协议.看下maven库&#xff0c;把http开头的改成https就好了。

B站武sir-django教程(1)

day15 初识Django Python知识点&#xff1a;函数、面向对象。前端开发&#xff1a;HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。Python的Web框架&#xff1a; Flask&#xff0c;自身短小精悍 第三方组件。Django&#xff0c;内部已集成了很多组件 第三方组件。…

Restormer技术点小结

1. 解决cnn的不足&#xff1a; 1&#xff09;感受野有限 2&#xff09;输入尺寸固定 2. 解决transform的不足&#xff1a; 1&#xff09;计算复杂度随着空间分辨率的增加而二次增长 3. 优势结构&#xff1a;MDTA(Multi-Dconv Head Transposed Attention)和GDFN( Gated-Dco…

医疗机构,为什么要开通预约挂号服务?门诊患者双向“获利”

随着科技的不断发展&#xff0c;越来越多的医疗机构开始提供预约挂号服务&#xff0c;以更方便、快捷地为患者提供就诊服务。 减少患者在等待时间上的压力&#xff0c;让患者更加有序地安排自己的就医计划。同时&#xff0c;预约挂号还可以提高医疗门诊工作效率与患者的满意度…

Sentinel使用详解

组件简介 Sentinel是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景&#xff0c;例如秒杀、消息削峰填谷、集群流量控…

C语言 内存操作函数 +内存分区

内存操作函数 memset() //memset 函数将指定内存区域 ptr 开始的 num 个字节设置为 value。 void *memset(void *ptr, int value, size_t num);参数&#xff1a;ptr&#xff1a;指向要填充的内存区域的指针。value&#xff1a;要填充的值&#xff0c;以整数形式传递。num&…

20-11版本AUTOSAR_PRS_LogAndTraceProtocol文档翻译

1简介和概述 本协议规范规定了AUTOSAR协议Dlt的格式、消息序列和语义。 该协议允许将诊断、日志和跟踪信息发送到通信总线上。 因此&#xff0c;Dlt模块从应用程序或其他软件模块收集调试信息&#xff0c;向调试信息添加元数据&#xff0c;并将其发送到通信总线。 此外&#x…

软件设计师——信息安全(一)

&#x1f4d1;前言 本文主要是【信息安全】——软件设计师——信息安全的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

QStringListModel 是 Qt 框架中用于在模型-视图(Model-View)架构中展示字符串列表的类

QStringListModel 是 Qt 框架中用于在模型-视图&#xff08;Model-View&#xff09;架构中展示字符串列表的类。 QStringListModel 继承自 QAbstractListModel&#xff0c;是一个基于字符串列表的数据模型。它提供了一种方便的方式来将字符串列表作为数据源&#xff0c;供各种…

华为OD试题五(数列描述、矩阵最大值、数据分类)

1. 数列描述 示例代码&#xff1a; # 核心 从第一项 推 第N项目 # 第一项 a0 1 # 推到 第N项 N 4 def fun(a0):# 计算每一项的具体值result left 0cursor 0while cursor < len(a0):if a0[cursor] ! a0[left]:count cursor -leftresult "{}{}".format(str(…

面相对象开发的原则

1、开闭原则 对修改关闭&#xff0c;对扩展打开。 2、里氏替换原则 子类继承父类的方法时&#xff0c;不可重写父类的方法。 如果重写了父类的方法会导致整个继承体系比较差&#xff0c;特别是运用多态比较平凡时&#xff0c;程序运行出错概率较大。 如果出现了违背“里氏替换…

计网Lesson9 - 链路协议和网络概述

文章目录 数据链路层协议Ethernet V2标准Ethernet V2帧格式Ethernet V2帧长度标准以太网帧 MAC 帧协议 PPP 协议PPP 概述PPP 帧 网络层网络层的设计选择 数据链路层协议 Ethernet V2标准 Ethernet V2帧格式 以太网帧格式说明&#xff1a; 6 6 6 字节目标地址 6 6 6 字节源地…

【LeetCode每日一题】1904. 你完成的完整对局数

给你两个字符串 startTime 和 finishTime &#xff0c;均符合 "HH:MM" 格式&#xff0c;分别表示你 进入 和 退出 游戏的确切时间&#xff0c;请计算在整个游戏会话期间&#xff0c;你完成的 完整对局的对局数 。 如果 finishTime 早于 startTime &#xff0c;这表示…

verilog基础,连续赋值之组合逻辑

连续赋值语句可以完成任意组合逻辑&#xff0c;本节对基本的逻辑电路进行测试分析&#xff0c;主要包含一下内容&#xff1a; 1. 反相器 2. 与门 3.与非门 4.或门 5.或非门 6.异或门 7.同或门 verilog实现逻辑操作的算符如下 // ~ .... Invert a single-bit signal…