[꼭대기] C + + 에서 RTTI 메커니즘 분석
2578 단어 RTTI
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]
위의 프로그램 을 통 해 알 수 있 듯 이 다 중 형식 이 아 닌 컴 파일 러 에서 유형 에 대한 확정 을 직접 해결 하면 프로그램의 운행 시간 을 줄 이 는 데 유리 하 다.
다 중 형식:
미완이다, 내일 다시 쓰 자