vtable 이란? (GPT4’s answer)


C++에서의 vtable (가상 함수 테이블)은 객체 지향 프로그래밍에서 다형성을 지원하기 위해 사용되는 메커니즘 중 하나입니다. 클래스에 가상 함수가 하나 이상 포함되어 있을 때, 컴파일러는 각 클래스 타입에 대해 **vtable**을 생성합니다. 이 테이블은 해당 클래스의 모든 가상 함수에 대한 주소를 저장합니다.

vtable의 역할과 작동 방식

혹시 vtable에 대해서 처음 접하는 사람이라면, GPT의 답변이 조금 혼란스러울 수 있는데, 아래 예제와 이를 분해해 보면서 이게 어떤 의미를 가지는지 알아보겠습니다.

vtable의 구조 파악


구조를 예제를 통해서 파악하기 전에, 글로 구조를 조금 설명해보겠습니다.

vtable pointer는 동적 바인딩을 위해 사용되는 포인터로 vitrual 함수를 멤버로 가진 클래스가 생성되는 객체의 처음 주소에 생성됩니다. (정적 바인딩의 경우 생성되지 않습니다.)

vtable pointer를 통해, 런타임에 호출된 동적 바인딩된 객체의 멤버함수들은 해당 vtable pointer를 역참조하여 적절한 vtable에 저장된 함수를 찾아서 실행하게 됩니다. 적절한 함수를 찾는 것은 컴파일 단계에서 vtable에서의 함수 위치를 index로 미리 담는 것으로 알 수 있습니다.

이때 주의할 점은, vtable은 컴파일 타임에 결정된다는 것 입니다. 런타임에 실행되는 것은 vtable pointer에 어떤 vtable을 담느냐 입니다.

저장되는 메모리 섹션은 각각 vtable pointer는 객체를 할당한 섹션(힙, 스택)에 저장되고, vtable은 정적 데이터 영역, vtable이 가리키는 각각의 함수는 텍스트 영역에 저장됩니다.