COM 구조에 관한 스터디 중 Inteface 지원을 위한 vptr 및 vtable에 관한 내용을 보다, 직접 vptr과 vtable memory layout을 쑤셔보고자 시작. 이 내용을 한두번 본 것도 아닌데 또다시 그냥 지나치려니 영 감질 맛이 나는거다. 하긴, 지금 아니면 언제 이 구조를 뜯어보겠어?

일단, vtable은 함수 포인터의 배열로 이루어진 가상함수 테이블을 의미하며, vptr은 vtable을 가리키는 C++ 개체에 숨겨진 포인터를 뜻한다. 이들 vtable 및 vptr이란 명칭은 관례적으로 그리 사용한다고. 물론 가상함수가 없는(해당 클래스에 virtual 키워드가 없는) 개체는 이들 둘 모두 없다. 따라서 해당 개체의 크기는 vptr의 크기(32bit OS일 경우 4byte)만큼 작아지겠다.

앞으로 보일 예제는 32bit WindowsXP 위의 Visual C++ 2005 버전으로 테스트한 것이다. 참고로, C++ 표준은 vptr의 개체내 위치나 vtable 구현법에 대해 지정하지 않는다고 한다. 따라서 컴파일러에 따라 결과는 달라질 것이다.

more..

2008/01/15 02:37 2008/01/15 02:37

트랙백 주소 :: http://anyflow.net/trackback/331

댓글을 달아 주세요

  1. 정성태 2008/01/15 08:34  댓글주소  수정/삭제  댓글쓰기

    아래의 글도. ^^

    __purecall이 무엇일까?
    ; http://www.jiniya.net/tt/597

    • 어쨌건간에 2008/01/15 09:49  댓글주소  수정/삭제

      C++/CLI 코딩 중에 봤었죠. 호출 규약인줄 알았는데 그게 아니군요~ 한 수씩 솔솔 감사드립니다~ ^^

요즘 C++의 virtual 메카니즘에 빠져서 산다. virtual.. 그리 오랜시간 보아왔는데도, 여전히 어렵다.. 다음은 오늘 알아낸 것들.

1. RTTI(Run-Time Type Identification), 실행 중에 기반(base) 클래스 타입 포인터의 실체를 밝혀내는데 쓰이는 typeid 연산자. 그 기반 타입의 포인터가 다형성을 지닌 클래스(polymophic class), 즉 "virtual 함수가 있는 클래스"가 아니면 아무짝에도 쓸모가 없다. "typeid(기반 타입의 포인터)" 해보았자, 보이는 그대로 그 기반 타입임만을 알려줄 뿐, 실제 담겨있는 타입, 즉 그 기반 타입의 포인터로부터 파생된 타입(derived type)에 대해서는 알려주는 바가 없다.

more..

2005/01/25 18:23 2005/01/25 18:23
TAG , ,

트랙백 주소 :: http://anyflow.net/trackback/30

댓글을 달아 주세요

이 내용 역시 면접 당시의 질문에서 버벅거린 사항들. 아...C++을 맞이한지 벌써 5년째 접어드는데, 이런 기본으로 아직까지도 버벅거리는 것을 보면, 거참...

virtual 키워드에 대해서

more..

2004/10/31 10:27 2004/10/31 10:27
TAG ,

트랙백 주소 :: http://anyflow.net/trackback/27

댓글을 달아 주세요