[導(dǎo)讀]最近研究了一波RTTI,整理了一下知識(shí)點(diǎn),在這里分享一下,下面是目錄:RTTI是RunTimeTypeInformation的縮寫(xiě),從字面上來(lái)理解就是運(yùn)行時(shí)期的類(lèi)型信息,它的主要作用就是動(dòng)態(tài)判斷運(yùn)行時(shí)期的類(lèi)型。一般在dynamic_cast和typeid中用到,例如父類(lèi)B的指針轉(zhuǎn)...
最近研究了一波RTTI,整理了一下知識(shí)點(diǎn),在這里分享一下,下面是目錄:
RTTI 是 Run Time Type Information 的縮寫(xiě),從字面上來(lái)理解就是運(yùn)行時(shí)期的類(lèi)型信息,它的主要作用就是動(dòng)態(tài)判斷運(yùn)行時(shí)期的類(lèi)型。
一般在dynamic_cast和typeid中用到,例如父類(lèi)B的指針轉(zhuǎn)換子類(lèi)A的指針,dynamic_cast會(huì)判斷B究竟是不是A的父類(lèi),如果不是,會(huì)返回nullptr,相對(duì)于強(qiáng)轉(zhuǎn)會(huì)更加安全。依據(jù)什么判斷的呢?就是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;} 結(jié)果如下:
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 上面的代碼是正常的一段使用多態(tài)的代碼,同時(shí)也包含了子類(lèi)指針轉(zhuǎn)基類(lèi)指針,基類(lèi)指針轉(zhuǎn)子類(lèi)指針,從輸出結(jié)果中可以看到,使用dynamic_cast進(jìn)行不合理的基類(lèi)子類(lèi)指針轉(zhuǎn)換時(shí),會(huì)返回nullptr,而強(qiáng)轉(zhuǎn)則不會(huì)返回nullptr,運(yùn)行時(shí)肯定就會(huì)出現(xiàn)奇奇怪怪的錯(cuò)誤,比較難排查。
如果在編譯時(shí)加上-fno-rtti會(huì)怎么樣?結(jié)果是這樣:
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編譯時(shí),使用typeid或dynamic_cast會(huì)報(bào)錯(cuò),即添加-fno-rtti編譯會(huì)禁止我們使用dynamic_cast和typeid。那為什么要禁止使用他們呢?
1. RTTI的空間成本非常高:每個(gè)帶有vtable(至少一個(gè)虛擬方法)的類(lèi)都將獲得RTTI信息,其中包括類(lèi)的名稱(chēng)及其基類(lèi)的信息。此信息用于實(shí)現(xiàn)typeid運(yùn)算符以及dynamic_cast。(大小問(wèn)題大家可以自己編寫(xiě)代碼驗(yàn)證一下)
2. 速度慢,運(yùn)行時(shí)多判斷了一層,性能肯定更慢一些。
tips:我這里又將typeid和dynamic_cast去掉重新編譯,結(jié)果表明添加了-fno-rtti,還是可以正常使用多態(tài),所以大家不用擔(dān)心rtti的禁用會(huì)影響多態(tài)的使用。
都知道RTTI信息是存在于虛函數(shù)表中,而添加-fno-rtti后代表禁止了RTTI,那虛函數(shù)表中還會(huì)有rtti信息嗎?
我這里使用clang的命令查看一下虛函數(shù)表:
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() 通過(guò)結(jié)果可以看到,即使添加了-fno-rtti,虛函數(shù)表中還是會(huì)存在RTTI指針,但是我查看很多文檔都說(shuō)rtti會(huì)導(dǎo)致可執(zhí)行文件的體積增大一些(畢竟-fno-rtti最大的目的就是為了減小代碼和可執(zhí)行文件的大?。?,所以我估計(jì)指針指向的塊里面可能什么信息都沒(méi)有,具體就不得而知了。
欲知詳情,請(qǐng)下載word文檔
下載文檔
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
在嵌入式系統(tǒng)和高可靠性軟件開(kāi)發(fā)中,靜態(tài)代碼分析已成為預(yù)防缺陷的關(guān)鍵手段。PC-Lint(現(xiàn)更名為Gimpel Lint)作為行業(yè)領(lǐng)先的C/C++靜態(tài)分析工具,能夠檢測(cè)出編譯器難以發(fā)現(xiàn)的隱式錯(cuò)誤和編碼規(guī)范違規(guī)。本文通過(guò)實(shí)戰(zhàn)...
關(guān)鍵字:
PC-Lint
軟件開(kāi)發(fā)
靜態(tài)代碼
在軟件開(kāi)發(fā)和系統(tǒng)運(yùn)維中,內(nèi)存泄漏是一個(gè)常見(jiàn)且棘手的問(wèn)題。它會(huì)導(dǎo)致系統(tǒng)內(nèi)存逐漸耗盡,進(jìn)而影響應(yīng)用程序的性能和穩(wěn)定性,甚至引發(fā)系統(tǒng)崩潰。無(wú)論是用戶(hù)態(tài)程序還是內(nèi)核態(tài)模塊,內(nèi)存泄漏都可能悄然發(fā)生。本文將介紹如何結(jié)合 kmemle...
關(guān)鍵字:
軟件開(kāi)發(fā)
內(nèi)存泄漏
kmemleak
智能時(shí)代的嵌入式系統(tǒng)離不開(kāi)高性能、高效的軟件和先進(jìn)的軟件開(kāi)發(fā)方式。本文介紹了近期嵌入式軟件開(kāi)發(fā)的三個(gè)趨勢(shì):1)邊緣計(jì)算作為一種在本地處理和分析數(shù)據(jù)的方式正在快速發(fā)展,邊緣計(jì)算與人工智能的結(jié)合正將智能計(jì)算從以云為中心的模型...
關(guān)鍵字:
嵌入式系統(tǒng)
邊緣計(jì)算
人工智能
虛擬化
軟件開(kāi)發(fā)
在軟件開(kāi)發(fā)過(guò)程中,調(diào)試是至關(guān)重要的一環(huán)。傳統(tǒng)的調(diào)試方法往往需要在代碼中插入打印語(yǔ)句(如printf),然后重新編譯、部署和運(yùn)行程序以查看輸出信息。然而,這種方法不僅繁瑣,而且在大型項(xiàng)目中,編譯和部署過(guò)程可能非常耗時(shí)。為了...
關(guān)鍵字:
GDB動(dòng)態(tài)打印
軟件開(kāi)發(fā)
北京2024年12月10日 /美通社/ -- 12月5-6日,由CSDN聯(lián)合高端IT咨詢(xún)與教育平臺(tái)Boolan聯(lián)合主辦的「2024全球C++及系統(tǒng)軟件技術(shù)大會(huì)」在上海虹橋萬(wàn)豪大酒店隆重召開(kāi)。在AI驅(qū)動(dòng)軟件開(kāi)發(fā)邁向智能化的...
關(guān)鍵字:
C++
系統(tǒng)軟件
ST
軟件開(kāi)發(fā)
作為軟件開(kāi)發(fā)中強(qiáng)大的生成式AI助手,Amazon Q Developer現(xiàn)在能夠加速單元測(cè)試、文檔生成、代碼審查,以及運(yùn)營(yíng)排錯(cuò),讓開(kāi)發(fā)者專(zhuān)注于更具創(chuàng)造力和有價(jià)值的工作上 北京2024年12月9日 /美通社/ --&nb...
關(guān)鍵字:
DEVELOPER
亞馬遜
軟件開(kāi)發(fā)
生成式AI
在MCU(微控制器單元)軟件開(kāi)發(fā)中,指針作為一種強(qiáng)大的工具,能夠顯著提高程序的靈活性和性能。然而,指針的使用也伴隨著一系列潛在的風(fēng)險(xiǎn)和陷阱,特別是在資源受限的嵌入式系統(tǒng)中。本文將深入探討MCU軟件開(kāi)發(fā)中使用指針時(shí)可能遇到...
關(guān)鍵字:
MCU
軟件開(kāi)發(fā)
指針
南京2024年10月29日 /美通社/ -- 數(shù)睿數(shù)據(jù)在企業(yè)數(shù)字化轉(zhuǎn)型中,基于每個(gè)企業(yè)的情況進(jìn)行調(diào)研、分析。每個(gè)企業(yè)數(shù)字化建設(shè)程度均不一致,部分企業(yè)建設(shè)了不少應(yīng)用系統(tǒng),也有部分企業(yè)尚未開(kāi)展信息化建設(shè)。 針對(duì)各企業(yè)的特點(diǎn)...
關(guān)鍵字:
代碼
數(shù)字化建設(shè)
軟件開(kāi)發(fā)
BSP
在軟件開(kāi)發(fā)中,沒(méi)有什么比獲得一個(gè)幾乎沒(méi)有文檔并且需要維護(hù)它的代碼庫(kù)更具挑戰(zhàn)性的了。文檔不僅告訴工程師特定函數(shù)或變量的作用,而且還演示和傳達(dá)了軟件以特定方式實(shí)現(xiàn)的原因。在構(gòu)建軟件時(shí)會(huì)做出數(shù)百萬(wàn)個(gè)決策,對(duì)于嵌入式開(kāi)發(fā)人員來(lái)說(shuō)...
關(guān)鍵字:
嵌入式
軟件開(kāi)發(fā)
在計(jì)算機(jī)系統(tǒng)發(fā)展的早期時(shí)代(20世紀(jì)60年代中期以前),通用硬件相當(dāng)普遍﹐軟件卻是為每個(gè)具體應(yīng)用而專(zhuān)門(mén)編寫(xiě)的。這時(shí)的軟件通常是規(guī)模較小的程序,編寫(xiě)者和使用者往往是同一個(gè)(或同一組)人。這種個(gè)體化的軟件環(huán)境,使得軟件設(shè)計(jì)通...
關(guān)鍵字:
軟件
軟件開(kāi)發(fā)
實(shí)時(shí)測(cè)試是軟件開(kāi)發(fā)生命周期的一個(gè)關(guān)鍵部分,涉及實(shí)時(shí)測(cè)試軟件應(yīng)用程序的可靠性和功能。這包括模擬實(shí)時(shí)環(huán)境或場(chǎng)景,以驗(yàn)證軟件應(yīng)用程序在各種負(fù)載條件下的性能。因此,實(shí)時(shí)測(cè)試已成為軟件測(cè)試的主要方面之一。它已經(jīng)普及,因?yàn)樗軌驕y(cè)試...
關(guān)鍵字:
實(shí)時(shí)測(cè)試
軟件開(kāi)發(fā)
驗(yàn)證是檢查軟件是否符合其規(guī)格的過(guò)程。它回答了以下問(wèn)題:“我們是否正確構(gòu)建了產(chǎn)品?”這意味著根據(jù)項(xiàng)目開(kāi)始時(shí)定義的要求檢查軟件是否按預(yù)期運(yùn)行。驗(yàn)證通常通過(guò)靜態(tài)測(cè)試完成,這意味著軟件實(shí)際上并未執(zhí)行。相反,代碼經(jīng)過(guò)審查、檢查或遍...
關(guān)鍵字:
軟件開(kāi)發(fā)
軟件驗(yàn)證
嵌入式軟件開(kāi)發(fā)是一門(mén)應(yīng)用廣泛且不斷發(fā)展的技術(shù)領(lǐng)域,為了滿(mǎn)足不同應(yīng)用場(chǎng)景的需求,開(kāi)發(fā)人員可以采用多種架構(gòu)方法。
關(guān)鍵字:
嵌入式
時(shí)間片
軟件開(kāi)發(fā)
事實(shí)表明,AI無(wú)法替代開(kāi)發(fā)者,但更適用于優(yōu)秀的開(kāi)發(fā)者。而識(shí)別大型語(yǔ)言模型(LLM)生成的代碼什么時(shí)候會(huì)出錯(cuò),需要開(kāi)發(fā)人員具有豐富的知識(shí)和經(jīng)驗(yàn)。
關(guān)鍵字:
AI編程
軟件開(kāi)發(fā)
AI
大型語(yǔ)言模型
LLM
嵌入式開(kāi)發(fā)是當(dāng)今信息技術(shù)領(lǐng)域不可或缺的一部分,它融合了硬件設(shè)計(jì)、軟件開(kāi)發(fā)和系統(tǒng)集成等多個(gè)學(xué)科,專(zhuān)門(mén)用于創(chuàng)建那些被嵌入到特定設(shè)備或系統(tǒng)中的專(zhuān)用計(jì)算機(jī)系統(tǒng)。嵌入式開(kāi)發(fā)的主要過(guò)程包括利用分立元件或集成器件進(jìn)行電路設(shè)計(jì)、結(jié)構(gòu)設(shè)計(jì)...
關(guān)鍵字:
嵌入式開(kāi)發(fā)
硬件設(shè)計(jì)
軟件開(kāi)發(fā)
12月15日,一場(chǎng)以技術(shù)交流和創(chuàng)新碰撞為核心的開(kāi)源大賽——開(kāi)放原子開(kāi)源大賽創(chuàng)新賽(簡(jiǎn)稱(chēng)“OpenHarmony創(chuàng)新賽”)在無(wú)錫市圓滿(mǎn)落幕。
關(guān)鍵字:
軟件開(kāi)發(fā)