[英]RTTI Overhead in C++
在C ++程序中啟用RTTI的內存/性能開銷是多少?
任何人都可以在RTTI機制的內部實現與相關的開銷之間找到一些啟示嗎?
我確實了解如何通過typeid
和dynamic_cast
使用RTTI,我想知道的是內部實現細節,這些細節涉及運行時如何跟蹤此信息以及如何產生開銷?
啟用RTTI通常只會帶來很小的開銷。 通常的實現在對象的vtable中帶有指向類型信息結構的指針。 由於必須始終構造vtable,因此額外的時間很少-就像在類中添加了另一個虛函數一樣。
因此, typeid
與調用虛函數相當。 dynamic_cast
較慢-它需要遍歷繼承層次結構以進行強制轉換。 過於頻繁地調用dynamic_cast
可能會成為性能瓶頸。 “ 可以 ”我的意思是通常不會……
由於typeinfo結構需要存儲在某個地方,因此可執行文件大小有些膨脹。 在大多數情況下,這無關緊要。
首先,由於是實現細節,因此沒有辦法確切說明不指定編譯器和版本會涉及多少開銷。 眾所周知,在某些編譯器中,dynamic_cast搜索類層次結構以進行字符串比較以匹配類名稱。
我想知道從何處獲得RTTI的“開銷”?
我在網上讀到,為了提供RTTI,需要一些(早期)C到C ++預處理器或翻譯器,類似的工具(GObject,QT,Objective-C,不確定)和其他程序。 朗格。 生成一些“幕后”代碼,但確實在內存和速度上產生了“開銷”。
我讀到,最終,“開銷”減少了,很多時候被認為是微不足道的。
也許您希望以匯編方式進行編程,或者使用“普通C”進行編程,而沒有RTTI開銷,因此比C ++容易得多
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.