[꼭대기] C + + 에서 RTTI 메커니즘 분석

2578 단어 RTTI
C + + 에서 실행 할 때 유형 정 보 를 얻 으 려 면 자바 에서 그렇게 편리 하지 않 습 니 다. 자바 의 모든 종 류 는 반사 체 제 를 통 해 클래스 의 기본 정보 (인터페이스, 부모 류, 방법, 속성, Annotation 등) 를 얻 을 수 있 습 니 다. 또한 자바 에 서 는 하나의 키 워드 를 제공 하여 실행 할 때 다른 유형의 하위 클래스 나 이런 대상 이 아 닌 지 판단 할 수 있 습 니 다.그러나 C + + 는 이렇게 많은 기능 이 없다. C + + 에서 얻 은 클래스 정 보 는 RTTI 메커니즘 을 통 해서 만 얻 을 수 있 고 기능 은 한계 가 있다. C + + 에서 최종 적 으로 생 성 된 코드 는 기계 와 직접 관련 된 것 이 고 자바 에 서 는 바이트 파일 을 생 성하 고 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: type: id 는 키워드 입 니 다.
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]


위의 프로그램 을 통 해 알 수 있 듯 이 다 중 형식 이 아 닌 컴 파일 러 에서 유형 에 대한 확정 을 직접 해결 하면 프로그램의 운행 시간 을 줄 이 는 데 유리 하 다.
 
다 중 형식:
미완이다, 내일 다시 쓰 자

좋은 웹페이지 즐겨찾기