Language/C++
C++ :: RTTI (Run-Time Type Information)VallistA2015. 5. 29. 10:54
RTTI는 C++에서 해당 포인터의 타입을 알아올 때 필요하다.
어떤 엔진이든, RTTI는 보이지 않는 곳에서 사용이 되며 Template을 사용할 때 예외처리로 상당히 많이 사용하게 된다.
원래 C++ 에서는 RTTI에 대한 표준화된 지원을 하지 않았다. 왜냐하면 C와의 후방 호환성을 유지할 수 없었기 때문과 효율성에 대해서 생각을 할 때 전혀 효율성이 존재하지 않을꺼란 믿음 때문이었다. Smalltalk, Lisp 같은 RTTI를 사용할 수 있는 언어들은 느린 성능 때문에 특징이 없어졌으며 동적 타입 체크의 성능 패널티는 시스템에 대한 타입을 저장하기 위해서 정보, 실행시간 객체 타입을 검색하는 시간이 매우 느린 과정이 있기 때문에 기피했다.
하지만 C++은 다중상속의 추가로 RTTI는 대두가 되기 시작했고 정적 타입체크 및 가상함수들이 충분하지 못하다는 것에 대해 반박이 불가능 했다. 그래서 RTTI가 생기게 되었다.
RTTI가 추가가 되면서 std::type_info가 std 에 추가되었다.
가정
class, 자료형에 관계없이 동작해야하는 프로그램일 때 클래스 자료형이 들어갈 때가 있고 노멀한 자료형이 들어갈 수가 있는데 그 중 class 자료형이 들어간다고 가정 했을때 class 자료형이 들어갈 때는 class 자료형이 가지고 있는 함수인 foo 를 호출한다고 하자. 그리고 그 의외의 경우에는 자료형 자체를 사용한다고 했을때 우리는 어떻게 알아와야 하는가?
클래스가 한두개가 아니고 미리 만들어져 있는 자료형이 아니라고 했을때 우리는 유추가 불가능하다.
RTTI를 쓰는 이유는 실행 중 기반 클래스 타입 포인터를 알아내는데에 목적을 두고 있다.
= 다형성을 가진 객체에 대해 정확한 타입 추론을 하는데 목적이 있으며 Template과 시너지가 좋다.
예시를 보도록 하자.
1. 의문
위의 소스를 실행시켜보면
class Toy
class Toy
라는 실행결과가 나온다.
왜 이렇게 나올까?
RTTI는 비 다형성 클래스에 대해서 선언하여 클래스 타입을 조회할 때 상속관계에서 하나 이상의 가상함수를 가지고 있어야 한다.
RTTI 기능이 활성화 되어야 하용할 수 있는 제약사항을 Dynamic_cast도 동일하게 가진다.
하지만 잘 짜여진 클래스에서는 가상함수를 사용할 일이 많기 때문에 이러한 제약은 프로그래머가 걱정할 필요가 없다. 보통 인터페이스로써 사용되는 추상적인 클래스가 존재하기 때문이다.
2. 해결
이렇게 해주면 깔끔하게 RTTI를 구현할 수 있다.
'Language > C++' 카테고리의 다른 글
C++ :: c#에 있는 event/delegate system 구현 (3) | 2016.02.18 |
---|---|
C++ :: C++ Style Cast (C++ 스타일 캐스트) (0) | 2015.04.02 |
C++ 11 :: Perfect Forwarding (퍼펙트 포워딩) (1) | 2015.02.14 |
C++ 11 :: Move Semantics (0) | 2015.02.14 |
C++ 11 :: R-Value Reference (0) | 2015.02.14 |
댓글
VallistA
병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.
현재는 이 블로그를 운영하지 않습니다.
vallista.kr 로 와주시면 감사하겠습니다!
자고 싶습니다. ㅠㅠ
Github :: 링크
궁금한점 문의 주시면 답변드리도록 하겠습니다
VISITED
Today :
Total :
Lately Post
Lately Comment