프로그래밍/C,C++

RTTI란?

MAKGA 2021. 6. 18. 20:55
320x100

RunTime Type Infomation

런타임에 타입 정보를 알 수 있다는 의미다.

즉, 실행 중에 클래스 포인터의 실제 타입을 확인할 수 있다.

 

C++는 C++98부터 RTTI를 지원해왔다.

typeid 연산자를 이용해 vftbl에 있는 정보로 타입을 확인한다.

 

vftbl의 정보를 확인하므로 두 클래스가 상속 관계라도 virtual 함수가 포함되어야 한다.

vftbl이 생성되지 않은 Child 클래스의 포인터의 타입
vftbl이 생성된 Child 클래스들의 포인터 변수 타입

 

dynamic_cast

dynamic_cast는 RTTI를 이용해 현재 객체의 정보를 검사할 수 있다.

dynamic_cast를 통해 형 변환을 수행하고, Parent의 포인터가 실제로 가리키는 객체의 타입과 동일하다면 유효한 포인터를 반환하고, 아니라면 nullptr을 반환한다.

다만 속도가 느리기 때문에 잘 사용하지 않는다.

call1에서는 호출되지 않았다.

 

커스텀 cast

CRTTI를 각 클래스의 정적 변수로 선언해주고, 상위 클래스가 있는 경우 CRTTI의 m_pBaseRTTI 멤버 변수에 상위 클래스의 CRTTI 정적 멤버 변수를 저장하고, 각 클래스의 CRTTI 정적 멤버 변수를 비교함으로써 클래스의 형식 정보를 알아낼 수 있다.

 

기존 dynamic_cast에 비해서 빨라졌다 하나 아직은 개선의 여지가 있습니다. 상위 클래스와 비교 시 상속 깊이만큼 루프를 돈다는 점이나 메모리 비 친화적이라는 점, 매크로를 많이 쓴다는 등이 있겠네요. 이런 점등은 좀 더 고민해봐서 개선을 해봐야 할 것입니다. 

 

출처: https://gamedevforever.com/19?category=387043 

 

Fast RTTI ( Run-Time Type Infomation )

안녕하세요. 친절한티스 라는 필명(?)을 쓰고 있는 박기헌입니다. 다른 네임드 필자분들이 워낙 고급 주제로 글을 올려주시는 바람에 저의 쩌렙티가 팍팍나는 글을 읽고 많은 분들이 실망하실까

gamedevforever.com

 

320x100

'프로그래밍 > C,C++' 카테고리의 다른 글

[C++] 동적 배열을 이용한 stack  (0) 2021.06.30
[C++] Object pool  (0) 2021.06.29
비동기 함수 정리  (0) 2021.03.22
가상 메모리 및 Large Address Aware  (0) 2020.02.19
C++ 연산자 오버로딩  (0) 2018.04.25