프로그래밍/c++2013. 7. 23. 14:39

RTTI(Run-Time Type Information)에 이어서 VFT(Virtual Function Table)에 대한 설명을 이어 가겠습니다.

RTTI 예제 소스상에서 특정위치에 브레이크 포인터를 걸고 객체의 값들을 살펴보았습니다.

 

위에서 보시는바와 같이 객체의 값들을 살펴보니 __vfptr이라는 이름이 존재합니다.

vfptr는 virtual function pointer 의 약자이며 가상 함수 포인터로 해석이 되겠네요.

가상함수의 경우 컴파일단에서 어느 함수가 호출 될지 모르기때문에 별도의 VFT(Virtual Function Table:가상함수테이블)라는 메모리상에 가상함수들이 자리잡게 됩니다.

위의 이미지를 참고하여 보시면 derivedPointet 객체와 basePointer 객체에 가상함수포인터가 같은 위치를 가르키고 있을것을 볼수있습니다.

각각의 인스턴스마다 각각의 가상함수테이블을 생성하게 된다면 메모리 낭비를 일으킬수있으므로 가상함수테이블은 객체의 생성과 무관하게 별도의 메모리상에 생성됩니다.(Stack이나 Heap이 아닌 별도의 영역이라고 합니다. 정확히 어딘지는 저도 잘...누가 아시면 좀 알려주세요;;)

객체가 생성될때 __vfptr(가상함수포인터)를 이용하여 VFT를 가르키게 되고 특정 가상함수를 호출했을때 해당하는 가상함수포인터가 가르키고있는 함수를 호출하게끔 유도해줍니다.(자식클래스에서 오버라이딩 된 함수가 있다면 자식클래스의 가상함수를 호출, 없다면 부모클래스의 가상함수를 호출)

RTTI의 경우 부모, 자식 클래스간 함수호출을 위해 만들어진 기능?이다보니 RTTI에 대한 정보가 c++표준위원회에서 규정으로 VFT에 들어가는걸로 알고있습니다.(RTTI가 추가되면서 이 기능에 관련된 메모리를 적재할곳을 찾다가 적당한곳이 VFT라고 판단한듯.)

뭐...굳이 부모클래스에서 virtual 함수를 쓸일이 없는데 RTTI를 꼭 쓰셔야 겠다는 분은 소멸자에 virtual 키워드를 붙이는 방법도 있는듯 합니다.



Posted by GaePein