對於C+的RTTI機制的初步思考
首先,很不好意思的說明,我還正在看C++ language programming,但還沒有看到關於RTTI的章節。另外,我也很少使用C++ RTTI的特性。所以對RTTI的理解僅限於自己的摸索和思考。如果不正確,請大家指正。
RTTI特性是C++語言加入較晚的特性之一。和其他語言(比如JAVA)相比,C++的RTTI能力算是非常差的。這與C++的設計要求應該有重要的關係:效能。沒錯,效能的因素使得C++的很多地方不能稱的上完美,但是也正因為如此,在高階通用語言裡面,只有C能和C++的效能可以相提並論。
1:typeid的研究
在C++中,似乎與RTTI相關的只有一個東西,就是dynamic_cast,本來我認為typeid是RTTI的一部分,但是我的實驗表明,並非如此。typeid的操作是在編譯時期就已經決定的了。下面的程式碼可以證明:
#include <iostream>
#include <typeinfo>
class A
{
};
class B:public A
{
};
int main()
{
A *pa;
B b,*pb;
pb = &b;
pa = pb;
std::cout<<"Name1:"
<< (typeid(pa).name())
<<"/tName2:"
<<(typeid(pb).name())
<<std::endl;
std::cout<<"pa == pb:"<< (typeid(pa) == typeid(pb))<<std::endl;
return 0;
}
typeid根本不能判別pa實際上是一個B*。換句話說,typeid是以字面意思去解釋型別,不要指望它能認出一個void*實際上是int*(這個連人也做不到:P)。實際上實用價值不大。
當然,在某些特殊地方,也是能夠有些效用的,比如模板。
template <class T>
void test(T t)
{
if(typeid(t) == typeid(char *))
{
// 對char *特殊處理
}
//...
}
如果編譯器優化的好的話,並不會產生廢程式碼,因為typeid編譯時期就可以決定了。
2:dynamic_cast
抱歉現在才講到正題,我對dynamic_cast第一印象就是,它究竟是怎麼實現的呢?經過一些思考,我認為最簡單的方案就是將資訊儲存在vtable裡,它會佔用一個vtalbe表的專案。實驗和書籍也證明了這一點。但是就會有一個問題,沒有vtable的類怎麼辦?內建型別怎麼辦?其實,沒有vtable的類,它不需要多型,它根本就不需要RTTI,內建型別也一樣。這就是說,dynamic_cast只支援有虛擬函式的類。而且, dynamic_cast不能進行non_base_class *到 class T*的轉換,比如void * --> class T *,因為它無法去正確獲得vtable。
這樣,dynamic_cast的意義和使用方法就很清楚了,它是為了支援多型而存在的。它用於實現從基類到派生類的安全轉換。同時它也在絕大多數情況下避免了使用static_cast--不安全的型別轉換。
3:結論
C++ 的RTTI機制雖然簡單,或者說簡陋,但是它使得靜態型別轉換變得無用了。這也是C++的一個不可缺少的機制。在未來,如果C++能夠提供可選的更強的RTTI機制,就像JAVA裡的那樣,這種語言可以變得更加強大。當然,到時如何提供不損失效能的 RTTI機制,更是一個值得深入研究的話題了。
相關文章
- 對於C+的RTTI機制的初步思考 (轉)
- 對於加密解密的初步瞭解加密解密
- 對於人工智慧的思考人工智慧
- Jmservice對於服務的思考
- 再次對於Matrix 的思考 (轉)
- WebService安全機制的思考與實踐Web
- UE4/UE5筆記-關於CreateDefaultSubobject的機制於使用場景的思考筆記Object
- 對於“AI威脅論”的思考AI
- 對於人生的一些思考
- 一個30歲程式設計師的對於中年危機的思考和應對程式設計師
- 一個 Reentrant Error 引發的對 Python 訊號機制的探索和思考ErrorPython
- 07.初步學習redis哨兵機制Redis
- 通過兩個案例初步瞭解Linux下selinux的安全機制工作機制Linux
- RTTI
- 對於es執行緒池使用的思考執行緒
- 對於最近的一些理解和思考
- 刨根問底:對於 self = [super init] 的思考
- 對函式的初步瞭解函式
- 關於Java類載入雙親委派機制的思考(附一道面試題)Java面試題
- 關於 Eloquent ORM 對資料處理的思考ORM
- 對於封裝react元件的一些思考封裝React元件
- 對於一個編解碼問題的思考
- 關於Java中的反射機制Java反射
- 基於ReAct機制的AI AgentReactAI
- 對於前端快取的理解(快取機制和快取型別)前端快取型別
- 對手機丟失後可能產生的危害的思考
- 關於我對Spring迴圈依賴的思考Spring
- C++物件導向特性實現機制的初步分析 Part3 (轉)C++物件
- C++物件導向特性實現機制的初步分析 Part1 (轉)C++物件
- 基於token的會話保持機制會話
- 關於JavaScript的記憶體機制JavaScript記憶體
- 關於ORACLE 和MYSQL INNODB 觸發髒資料寫的機制對比OracleMySql
- 普通反爬蟲機制的應對策略爬蟲
- 關於Vue的元件與模板的初步理解Vue元件
- 關於面試的思考面試
- 關於Ioc的思考
- ReflectUitls類的編寫和對反射機制的解析UITLS反射
- 關於點贊業務對MySQL和Redis和MongoDB的思考MySqlRedisMongoDB