對於C++的RTTI機制的初步思考

來源:互聯網
上載者:User

首先,很不好意思的說明,我還正在看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機制,更是一個值得深入研究的話題了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.