对于C+的RTTI机制的初步思考

原创 2002年03月14日 09:45:00

      首先,很不好意思的说明,我还正在看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机制的初步思考

首先,很不好意思的说明,我还正在看C++ language programming,但还没有看到关于RTTI的章节。另外,我也很少使用C++ RTTI的特性。所以对RTTI的理解仅限于自己的摸索和思考...
  • dongzhiquan
  • dongzhiquan
  • 2009年08月05日 16:57
  • 337

RTTI机制与作用

一、RTTI(Run-Time Type identification),通过运行时类型信息,程序能够使用基类的指针或引用来检查这些指针或引用所指向的对象的实际派生类型。面向对象的编程语言,想C++,...
  • gogoky
  • gogoky
  • 2016年05月04日 21:15
  • 2379

C++中的RTTI机制解析

RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。 RTTI机制的...
  • three_bird
  • three_bird
  • 2016年05月23日 09:31
  • 5952

java的RTTI

在Java中,RTTI表现在:1。Class对象,是RTTI的核心,每个类都有一个class对象。每当编写并且编译一个新类,就会产生一个Class对象(被保存在同名的.class文件当中)2。inst...
  • FG2006
  • FG2006
  • 2011年05月08日 18:22
  • 5664

对于RTTI机制的理解

转载: 个人实在是觉得这篇博客写的特别容易理解 ,只要耐心看下去,肯定收货很大!!! http://www.jb51.net/article/55968.htm  这篇文章主要介绍了C++中的...
  • My_heart_
  • My_heart_
  • 2016年09月01日 17:11
  • 307

对自己的人生道路思考(二)

       今天看了一下韩剧《我的名字叫金三顺》,很喜欢这样的片子,搞笑之余可以体会到主人公的乐观,生机勃勃的生活态度。给我的印象是三顺是一个大胆,乐观,直爽,充满激情的女生,很喜欢她那样的性格,天...
  • horsespirit
  • horsespirit
  • 2006年06月07日 20:47
  • 790

关于公司层次的思考

今天在工作时,领导和同事们一再提到“对标”这个词,引发了对公司层级的一些思考。     首先弄清,“对标”的含义。     对标分析:又叫标杆管理(benchmarking),也称基准管理。是指一...
  • u010978815
  • u010978815
  • 2017年03月12日 01:42
  • 307

对于人工智能的思考

这些天来被AlphaGo和李世石的"世纪人机大战"刷屏,由此引出的对人工智能好坏的思考成为人们以及媒体谈论的焦点,一说人工智能将会服务人类,战胜李世石是计算机史上的里程碑事件,又一说自学习人工智能将会...
  • u010168422
  • u010168422
  • 2016年03月19日 15:45
  • 434

C++中RTTI机制剖析

[置顶] C++中RTTI机制剖析 分类: C/C++2013-08-03 20:26 412人阅读 评论(0) 收藏 举报 C++编译器RTTI C++中要想在运行时获取类...
  • pi9nc
  • pi9nc
  • 2014年03月21日 20:34
  • 2911

关于产品的一些思考——知乎

AlienTech for better life!~
  • twlkyao
  • twlkyao
  • 2014年01月02日 15:10
  • 1746
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对于C+的RTTI机制的初步思考
举报原因:
原因补充:

(最多只允许输入30个字)