簡體   English   中英

C ++中的RTTI開銷

[英]RTTI Overhead in C++

在C ++程序中啟用RTTI的內存/性能開銷是多少?
任何人都可以在RTTI機制的內部實現與相關的開銷之間找到一些啟示嗎?
我確實了解如何通過typeiddynamic_cast使用RTTI,我想知道的是內部實現細節,這些細節涉及運行時如何跟蹤此信息以及如何產生開銷?

啟用RTTI通常只會帶來很小的開銷。 通常的實現在對象的vtable中帶有指向類型信息結構的指針。 由於必須始終構造vtable,因此額外的時間很少-就像在類中添加了另一個虛函數一樣。

因此, typeid與調用虛函數相當。 dynamic_cast較慢-它需要遍歷繼承層次結構以進行強制轉換。 過於頻繁地調用dynamic_cast 可能會成為性能瓶頸。 可以 ”我的意思是通常不會……

由於typeinfo結構需要存儲在某個地方,因此可執行文件大小有些膨脹。 在大多數情況下,這無關緊要。

請閱讀本文檔中的相應部分。

總結一下:

  • typeid (5.3.7):通過查找最派生的類對象來查找vtable,然后從該對象的vtable中提取type_info。 與函數調用相比仍然很慢;

  • dynamic_cast (5.3.8):如上所述找到type_info,然后確定是否可以轉換,然后調整指針。 運行時成本取決於所涉及的兩個類在類層次結構中的相對位置。 現在,向下廣播和交叉廣播非常慢(盡管您可以在此處找到有關dynamic_cast可能(但受限制的)恆定時間實現的文章)。

首先,由於是實現細節,因此沒有辦法確切說明不指定編譯器和版本會涉及多少開銷。 眾所周知,在某些編譯器中,dynamic_cast搜索類層次結構以進行字符串比較以匹配類名稱。

我想知道從何處獲得RTTI的“開銷”?

我在網上讀到,為了提供RTTI,需要一些(早期)C到C ++預處理器或翻譯器,類似的工具(GObject,QT,Objective-C,不確定)和其他程序。 朗格。 生成一些“幕后”代碼,但確實在內存和速度上產生了“開銷”。

我讀到,最終,“開銷”減少了,很多時候被認為是微不足道的。

也許您希望以匯編方式進行編程,或者使用“普通C”進行編程,而沒有RTTI開銷,因此比C ++容易得多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM