zoukankan      html  css  js  c++  java
  • [置顶] C++中RTTI机制剖析

    C++中要想在运行时获取类型信息,可没有Java中那么方便,Java中任何一个类都可以通过反射机制来获取类的基本信息(接口、父类、方法、属性、Annotation等),而且Java中还提供了一个关键字,可以在运行时判断一个类是不是另一个类的子类或者是该类的对象,但C++却没有这么多功能,C++中获得类信息只能通过RTTI机制,而且功能还是很有限的,因为C++中最终生成的代码是直接与机器相关的,而Java中会生成字节码文件,再由JVM加载运行,字节码文件中可以含有类的信息。

    C++中RTTI的简单源程序示例:

    class A{
    private:
    	int a;
    };
    class B{
    public: 
    	//加一个虚函数
    	virtual void f(){}
    };
    class C:public B
    {
    public :
    	void f(){};
    };
    class D:public A
    {
    public:
    	void f(){}
    };
    int main()
    {
    	int a=2;
    	//打印出int
    	cout<<typeid(a).name()<<endl;
    	A objA;
    	//打印出class A
    	cout<<typeid(objA).name()<<endl;
    	B objB;
    	//打印出class B
    	cout<<typeid(objB).name()<<endl;
    	C objC;
    	//打印出class C
    	cout<<typeid(objC).name()<<endl;
    	/*
    	//以下是多态在VC 6.0编译器不支持,但是在GCC以及微软更高版本的编译器却都是
        //支持的,且是在运行时候来确定类型的,而不是在编译器,会打印出class c
    	B *ptr=new C();
    	cout<<typeid(*ptr).name()<<endl;
    	*/
    	A *ptr=new D();
    	//打印出class A而不是class D
    	cout<<typeid(*ptr).name()<<endl;
    	return 0;
    }
    

    要想理解上述代码:我们需要明白以下几个事实

    1:typeid是一个关键字

    2:typeid的结果有时候在编译期确定有时间会在执行期确定

    3:typeid运行时,会将判断的结果存储在一个consttypeinfo&对象中

    4:不同的编译器对typeid运算的结果差异很大,例如在VC 6.0与G++编译器中,G++编译器支持运行时动态确定类型,而VC 6.0则不支持。

    1:typeid是一个关键字,可以在任意一本C++入门书中看到,typeid是一个关键字,像Sizeof一样,要是函数的话,函数传参你有见过这样的吗typeid(int),直接传int,而不是传一个整型值的,我是没见过:)

    2:看看上述的程序,你会发现上述程序中除了多态的那一部份(在VC 6.0中是无法编译通过的),其他的均是在编译期运行,多态的会在执行期去运行,为了更具说服务力,看看下面的代码,是上面程序的部分汇编代码:

    30:       //打印出int
    31:       const type_info &t=typeid(a);//从下面的汇编代码中可以看出类型在编译期就已经确定了
    004011C4   mov         dword ptr [ebp-14h],offset int `RTTI Type Descriptor' (00441e08)
    32:       cout<<t.name()<<endl;
    004011CB   push        offset @ILT+35(std::endl) (00401028)
    004011D0   mov         ecx,dword ptr [ebp-14h]
    

    从上面的程序,可以看出对于不是多态类型的,直接在编译器就解决了类型的确定,这样有利于减少程序的运行时间

    对于多态类型:

    未完,明天再写吧

  • 相关阅读:
    sphinx实时索引和高亮显示
    打开页面就进行下载的一种方法
    mysql开启慢查询日志以及查看(转载自网络)
    Best MVC Practices(最优的MVC布局)
    nginx虚拟机配置(支持php)
    一个简单大方的赞后+1,踩后-1js动画效果
    如何创建ajax对象?
    psd图片到html
    小知识
    sass入门
  • 原文地址:https://www.cnblogs.com/riskyer/p/3235357.html
Copyright © 2011-2022 走看看