[컴][c/c++] virtual function 의 dynamic binding 동작

virtual function / vtable / 다이내믹 바인딩 / 가상함수


Dynamic binding

compiler 가 static table 을 만든다.(static variable 이 되는 것과 비슷하다.) non-inline virtual function 을 정의한 .cpp 를 compiler 가 compile 하면서 이 v-table 을 생성하게 된다. 정의된 class 에 대해 v-table 을 만들고, __vptr 을 set 하는 과정은 아래와 같다.
vtable 생성 및 __vptr 초기화 과정
1. vtable 을 만든다. : .cpp 파일을 보면서 만드는 것이기 때문에, class 마다 생성된다. instance 가 만들어질 때마다 생성되는 것이 아니다. code 로 말하자면 base class 마다 function pointer table(static table) 을 하나씩 추가 해 주는 것이다. 예제는 ref. 2 를 참고하자.
2. class 에 __vptr 을 추가한다.(base class 에서만)
3. compiler 가 contructor 에서 각 instance 의 __vptr 을 초기화 시켜준다.
derived class 에서는 2번째 과정을 하지 않는다. 왜냐하면, 당연한 소리겠지만, base class 에서 __vptr 을 이미 추가 해 놓은 상황이어서, 자동으로 상속되기 때문에 따로 만들 필요가 없다.

참고로, __vptr 은 base class 에 만들어지게 되고, 상속받은 class(derived class) 도 자연히 상속을 받게 되어있지만, __vptr 은 instance 가 생성될 때 set 이 되기 때문에 각각의 instance 의 __vptr 은 다른 값이 되는 것이다.

실제 virtual function 이 호출되면, __vptr 이 가리키는 vtable 에서 호출을 요청한 function 을 찾고, 그 function pointer 를 이용하게 된다. c++ 에서 function pointer 의 syntax 를 확인하려면, 여기를 참고하자.

ref. 2 에 나온 Pseudocode 를 참고하면 아래와 같다.


References

  1. http://minjang.egloos.com/2934460
  2. http://isocpp.org/wiki/faq/virtual-functions#dyn-binding2
  3. http://www.newty.de/fpt/fpt.html#defi

댓글 없음:

댓글 쓰기