[导读]最近研究了一波RTTI,整理了一下知识点,在这里分享一下,下面是目录:RTTI是RunTimeTypeInformation的缩写,从字面上来理解就是运行时期的类型信息,它的主要作用就是动态判断运行时期的类型。一般在dynamic_cast和typeid中用到,例如父类B的指针转...
最近研究了一波RTTI,整理了一下知识点,在这里分享一下,下面是目录:
RTTI 是 Run Time Type Information 的缩写,从字面上来理解就是运行时期的类型信息,它的主要作用就是动态判断运行时期的类型。
一般在dynamic_cast和typeid中用到,例如父类B的指针转换子类A的指针,dynamic_cast会判断B究竟是不是A的父类,如果不是,会返回nullptr,相对于强转会更加安全。依据什么判断的呢?就是RTTI。
先看下面这段代码:
#include using std::cout;using std::endl;class Base{public: int a; int b; Base() { cout << this << " Base \n"; } virtual void func(){ cout << this << " hello Base \n"; }; void basefunc(){ cout << this << " hello basefunc \n"; }};class BaseBB{public: int d; int c; BaseBB() { cout << this << " BaseBB \n"; } virtual void func(){ cout << this << " hello BaseBB \n"; }};class Derive : public Base{public: Derive() { cout << this << " Derive \n"; } void func() override{ cout << this << " hello Derive \n"; }};int main(){ Derive *d = new Derive; typeid(d); d->func(); Base *b = static_cast(d); b->func(); b->basefunc(); Derive *b1 = dynamic_cast(b); Derive *b2 = static_cast(b); b1->func(); b2->func(); BaseBB *b3 = dynamic_cast(b); BaseBB *b4 = reinterpret_cast(b); cout << d << " " << b << " " << b1 << " " << b2 << " " << b3 << " " << b4 << endl; return 0;} 结果如下:
clang test_rtti.cc -std=c 11;./a.out
0x7fe80ac05920 Base 0x7fe80ac05920 Derive 0x7fe80ac05920 hello Derive 0x7fe80ac05920 hello Derive 0x7fe80ac05920 hello basefunc 0x7fe80ac05920 hello Derive 0x7fe80ac05920 hello Derive 0x7fe80ac05920 0x7fe80ac05920 0x7fe80ac05920 0x7fe80ac05920 0x0 0x7fe80ac05920 上面的代码是正常的一段使用多态的代码,同时也包含了子类指针转基类指针,基类指针转子类指针,从输出结果中可以看到,使用dynamic_cast进行不合理的基类子类指针转换时,会返回nullptr,而强转则不会返回nullptr,运行时肯定就会出现奇奇怪怪的错误,比较难排查。
如果在编译时加上-fno-rtti会怎么样?结果是这样:
clang test_rtti.cc -std=c 11 -fno-rtti
test_rtti.cc:60:5: error: use of typeid requires -frtti typeid(d); ^test_rtti.cc:65:18: error: use of dynamic_cast requires -frtti Derive *b1 = dynamic_cast(b); ^test_rtti.cc:69:18: error: use of dynamic_cast requires -frtti BaseBB *b3 = dynamic_cast(b); ^3 errors generated. 可以看到,加上了-fno-rtti编译时,使用typeid或dynamic_cast会报错,即添加-fno-rtti编译会禁止我们使用dynamic_cast和typeid。那为什么要禁止使用他们呢?
1. RTTI的空间成本非常高:每个带有vtable(至少一个虚拟方法)的类都将获得RTTI信息,其中包括类的名称及其基类的信息。此信息用于实现typeid运算符以及dynamic_cast。(大小问题大家可以自己编写代码验证一下)
2. 速度慢,运行时多判断了一层,性能肯定更慢一些。
tips:我这里又将typeid和dynamic_cast去掉重新编译,结果表明添加了-fno-rtti,还是可以正常使用多态,所以大家不用担心rtti的禁用会影响多态的使用。
都知道RTTI信息是存在于虚函数表中,而添加-fno-rtti后代表禁止了RTTI,那虚函数表中还会有rtti信息吗?
我这里使用clang的命令查看一下虚函数表:
clang -Xclang -fdump-vtable-layouts -stdlib=libc -fno-rtti -c test_rtti.cc
test_rtti.cc:51:17: warning: 'override' keyword is a C 11 extension [-Wc 11-extensions] void func() override ^Original map void Derive::func() -> void Base::func()Vtable for 'Derive' (3 entries). 0 | offset_to_top (0) 1 | Derive RTTI -- (Base, 0) vtable address -- -- (Derive, 0) vtable address -- 2 | void Derive::func()
VTable indices for 'Derive' (1 entries). 0 | void Derive::func() 通过结果可以看到,即使添加了-fno-rtti,虚函数表中还是会存在RTTI指针,但是我查看很多文档都说rtti会导致可执行文件的体积增大一些(毕竟-fno-rtti最大的目的就是为了减小代码和可执行文件的大小),所以我估计指针指向的块里面可能什么信息都没有,具体就不得而知了。
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
12月15日,一场以技术交流和创新碰撞为核心的开源大赛——开放原子开源大赛创新赛(简称“OpenHarmony创新赛”)在无锡市圆满落幕。
关键字:
软件开发
Laval社区以服务OpenHarmony开发者为宗旨,目标是打造最专业、最全面的OpenHarmony技术交流平台,致力于推动OpenHarmony生态长足发展,让OpenHarmony走进千行百业。
关键字:
软件开发
AI Workbench助力软件开发“左移”,使软件设计周期摆脱对芯片的依赖。
关键字:
AI
软件开发
明显改善测试自动化相关用户体验,并为泰克和Keithley的客户提供无缝的仪器控制效果。
关键字:
软件开发
Python
近日,OpenHarmony 4.0 Release版本如期发布,开发套件同步升级到API 10。
关键字:
软件开发
操作系统
基于开发痛点,HarmonyOS NEXT通过构建Smart Perf工具全家桶,为开发和测试人员提供了测试、调优、分析一站式服务,接下来让我们一起来看Smart Perf如何解决开发性能问题。
关键字:
软件开发
HarmonyOS
嵌入式软件开发将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对它的相关情况以及信息有所认识和了解,详细内容如下。
关键字:
嵌入式
嵌入式软件开发
软件开发
Java是一种广泛应用于软件开发的编程语言,它具有跨平台、面向对象和高度可靠性的特点。在嵌入式系统设计中,Java也有着广泛的应用方案。本文将详细介绍Java在嵌入式系统设计中的应用方案,并分析其优势和挑战。
关键字:
Java
软件开发
编程语言
(全球TMT2023年9月7日讯)在近日举行的德国国际汽车及智慧出行博览会(IAA Mobility)上,高通技术公司与亚马逊云科技共同宣布,双方将携手致力于汽车行业的长期创新。亚马逊云科技和高通技术公司将结合各自领域...
关键字:
亚马逊
汽车
软件开发
高通
在过去数十年,摩尔定律一直支配着半导体的发展。随着MCU的性能越来越强,嵌入式产品也越来越智能,嵌入式软件也变得越来越复杂。编译器作为嵌入式软件开发的基础工具,将程序员编写的源代码转换为底层硬件可以执行的机器指令。一款优...
关键字:
摩尔定律
嵌入式
软件开发
编译器
是第一家在Click boards™开发版上将mikroSDK Click驱动程序集成到自己的软件开发环境中的IC供应商
关键字:
嵌入式
软件开发
mikroBUS插座
精心萃取的专家经验将有助于提高生产力、最大化投资回报和成功开发高质量嵌入式软件
关键字:
嵌入式
软件开发
(全球TMT2022年11月8日讯)德州仪器 (TI)面向 Wi-Fi 和 Thread SimpleLink™ 无线微控制器 (MCU) 推出了支持 Matter 的全新软件开发套件,将简化 Matte...
关键字:
软件开发
开发套件
TE
全球IT服务和技术解决方案公司Sonata Software宣布其印度班加罗尔全球村园区最先进的新开发中心启用。这家新开发中心占地5388平方米,拥有600多个工作站,并且在设计上考虑了更好的团队合作。新中心将专注于为其...
关键字:
软件开发
数字化
SOFTWARE
MT
哈喽,大家好,我是月亮。一个工作n年的老程序员啦,平时在公号上给大家分享一些心得体会/有趣的工具,每周更新~今天月亮想和大家聊一下,我是怎么从一个什么都不会的计算机专业的小白,成功入门软件开发的。
关键字:
程序员
计算机
软件开发
正如Linus Torvalds曾经说过的,大多数安全问题都是bug造成的,而bug又是软件开发过程的一部分,是软件就有bug。至于是安全还是非安全漏洞BUG,内核社区的做法就是尽可能多的测试,找出更多潜在漏洞这样近似于...
关键字:
Linus Torvalds
软件开发
防御技术
该统一硬件提供灵活的容量,既可为硬件验证提供更快的编译,又可为软件开发提供更佳的性能 加利福尼亚州山景城2022年9月27日 /美通社/ -- 新思科技(纳斯达克股票代码:SNPS)近日宣布推出业内首款基于其ZeBu&...
关键字:
芯片
硬件仿真
新思科技
软件开发
摘要:创造性地将"通用双公式"模型嵌入到纤维缠绕层网格理论中,解决了因传统网格理论无法准确模拟纤维纱片在高纬度球壳处的重叠现象而带来的纤维层结构设计安全裕度大、结构效率低的问题。基于新方法理论,以球形复合材料气瓶为例,分...
关键字:
球形COPV
纤维缠绕层结构设计
软件开发
(全球TMT2022年7月22日讯)近日,TUV北德在比亚迪汽车工业公司(简称“比亚迪”)总部六角大楼向比亚迪颁发ASPICE L2级评估证书。ASPICE 全称为“Automotive Software Proces...
关键字:
SPICE
比亚迪
汽车
软件开发