大家都来指导指导,由boost里面的使用typeid操作符引出的我的问题.
这两天看了一下boost的代码,在boost::any的代码里面看到了操作符typeid,typeid使我第一个想到了RTTI,我不喜欢RTTI,我对RTTI内部知道很少,到现在我一直认为RTTI在程序里面每一个出现的有vTable的类都要加上额外信息而有些类根本不需要这些RunTime信息,所以没什么库用RTTI,要runtime也自己写.
boost怎么会用RTTI机制呢,是我那里错了吧,带着问题我又学习了一下c++的相关内容,发现这些地方我都没有搞清楚.
1 catch块需要RTTI么?
如下测试程序:
#include "stdafx.h"
#include "stdio.h"
class aaa
{};
class bbb
{public :virtual ~bbb(){};};
int main(int argc, char* argv[])
{
try
{ throw 5; }
catch (int val) { printf("\nint"); }
catch (double val) { printf("\ndouble");}
catch(char val) { printf("\nchar");}
try
{ throw aaa(); }
catch (int val) { printf("\nint"); }
catch (double val) { printf("\ndouble");}
catch(char val) { printf("\nchar");}
catch(aaa val) { printf("\ntype aaa");}
catch(bbb val) { printf("\ntype bbb");}
try
{ throw bbb(); }
catch (int val) { printf("\nint"); }
catch (double val) { printf("\ndouble");}
catch(char val) { printf("\nchar");}
catch(aaa val) { printf("\ntype aaa");}
catch(bbb val) { printf("\ntype bbb");}
return 0;
}
msvc60编译器编译通过并不需要在project seting中复选上Enable Run-Time Type Information[RTTI] 复选框.
可见好像没有C++的RTTI机制代码参与程序的运行, 可是catch块捕获异常是对异常类型的判断毫无疑问的是runTime的.???????
2 typeid 需要 RTTI支持么?
class aaa
{};
class bbb:public aaa
{};
void main()
{
aaa one,two;
bbb three;
if(typeid(one)==typeid(two)){printf("\n ok");}
if(typeid(one)==typeid(three)){printf("\n ok");}
aaa *p1=NULL;
const type_info& ty11=typeid(p1);
printf("\n%s",ty11.name());
const type_info& ty12=typeid(*p1);
printf("\n%s",ty12.name());
bbb *p2=(bbb*)p1;
const type_info& ty21=typeid(p2);
printf("\n%s",ty21.name());
const type_info& ty22=typeid(*p2);
printf("\n%s",ty22.name());
}
msvc60编译器编译通过并不需要在project seting中复选上Enable Run-Time Type Information[RTTI] 复选框.
如果把类bbb改一下,给它一个vtble
class bbb:public aaa
{public :virtual ~bbb(){};};
则msvc60编译器要求RTTI机制
typeid操作符返回的结果是 在编译期就已经确定下来的,还是 一部分结果在编译器就确定下来另一部分结果确需要到运行期确定(需要RTTI),我这里觉得是第二个答案.
问题又有了,typeid操作符编译器是在什么情况下决定用RTTI机制
在运行期返回结果呢?谁来给我一个相关的条文标准.