본문 바로가기
Development/C++

가상함수 테이블의 메모리 구조

by KingCat 2013. 12. 11.

- 가상 함수를 하나 이상 포함하는 클래스의 경우 기본 가상함수 테이블이 생성된다.


- 이후, 인스턴스 생성시 인스턴스용 가상함수 테이블이 생성된다.


- 인스턴스가 여러개 생성시 메모리 절약을 위하여 여러 인스턴스가 동일한 가상함수 테이블을 가르키게 된다.


- 이때, 인스턴스에서 오버라이딩된 가상함수가 없으면, 가상함수 테이블은 자동으로 부모클래스의 가상함수 정의를 참조하고, 오버라이딩된 가상함수가 있으면, 재정의된 가상함수 정의를 참조하게된다


- 가상함수 테이블은 런타임시 결합(동적 결합)되므로 시작시에는 같은 함수를 참조하고 있다가, 호출시에 함수의 주소가 동적할당된다. 일반 함수들은 미리 결합이 되는 정적 결합이다.


- 가상 함수는 가상 함수의 포인터를 가지고 있어야 되므로 가상함수를 가진 클래스는 크기가 4바이트가 추가된다.


- memset 같은 전체적인 메모리 초기화 함수를 써서는 안된다. 당연히 memset시 동적 결합전에 같은 곳을 참조하고 있다가 초기화되면서 오버라이딩된 함수들이 호출해야 될 가상함수의 주소까지 초기화 되버린다.


- 가장 큰 장점은 함수 오버라이딩이 가능케 해준다는 것이다.

'Development > C++' 카테고리의 다른 글

가상 소멸자의 사용 이유  (0) 2014.09.22
메모리 단편화  (0) 2014.09.22
함수 오버라이딩(overriding)과 오버로딩(overloading)  (0) 2013.12.11
virtual  (0) 2013.12.11
[STL] vector에서 size(), reserve() 함수의 역할  (0) 2013.12.11