본 게시글은 공부용으로 작성된 글입니다.
가상함수테이블이란?
한 개 이상의 가상 함수를 포함하는 클래스에 대해서는 컴파일러가 다음과 같은 형태의 '가상함수 테이블'을 만든다.
가상 함수 테이블은 가상 함수 포인터를 모아둔 배열이다. 이는 vtable 이라고 한다.
가상함수 포인터(vfptr)는 가상함수를 추가할 경우 객체의 멤버 변수로 가상 함수 테이블을 가리키는 포인터를 멤버 변수로 추가를 시킨다.
(말이 너무 어려운데, 가상함수를 가리키는 포인터를 멤버변수로 추가한다는 부분만 보면 된다.)
가상함수 테이블을 보면, key와 value가 있다.
key에는 호출하고자 하는 함수를 구분 지어주는 식별자이고, value는 구분자에 해당하는 함수의 주소이다.
가상 함수 테이블에 추가된 멤버변수의 실질적인 값들을 확인해본다면 (저장되어있는 주소들을 확인해본다면)
가상 함수를 재정의 하지 않았을때는 부모클래스 함수의 주소를 가리키고 있지만 재정의하면 재정의된 함수의 주소를 가리킨다.
가상함수를 재정의하게된다면 가상 함수테이블에 가상 함수 포인터가 추가되기 때문에 자기의 클래스에 맞는 함수를 찾아갈 수 있게된다.
또한, 가상 함수 테이블은 가상 함수가 있는 클래스마다 1개씩만 생성이 된다.
C++는 이런 가상함수 테이블( V-Table / Virtual Table)이 있고, 이는 다형성에 굉장히 유리하기 때문에 유용하게 활용된다.
하지만, 클래스에 가상 함수가 포함되면 가상함수 테이블이 생성되고, 또 이 테이블을 참조하여 호출될 함수가 결정되기에
C에 비해 실행 속도가 더 느리다.
'프로그래밍 > C++' 카테고리의 다른 글
Lvalue Rvalue (0) | 2022.08.23 |
---|---|
복사생성 (0) | 2022.08.23 |
가상함수 및 재정의 (0) | 2022.08.19 |
생성자와 소멸자 (0) | 2022.08.18 |
정적변수(static variable) (0) | 2022.08.17 |
댓글