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