PersonalCorpus 版 (精华区)

发信人: tcpip (生命如草木般脆弱), 信区: C_and_CPP
标  题: 转贴一个:关于RTTI的
发信站: 哈工大紫丁香 (2003年11月07日10:10:09 星期五), 站内信件

标题:对于C+的RTTI机制的初步思考 查看此会员其它文章
  
文章的关键字:  
发布人:156ok 发布时间:2002-5-27 10:20:34 
----------------------------------------------------------------------- 
 
作者:neccui

首先,很不好意思的说明,我还正在看C++ language programming,但还没有看到关于RTT
I的章节。另外,我也很少使用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机制,更是一
个值得深入研究的话题了。 

--

师傅接过酱油,叹了口气,唠叨说:
“喝酱油,我倒不怕,我天生肤白貌美,脸部皮肤堆积点色素也无大碍。。。
就怕悟净,脸已这样黑,
再喝酱油怕是白天也看不见他了!”
  

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 61.144.148.100]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.345毫秒