본문 바로가기

C++

정적 바인딩, 동적 바인딩, 가상 함수 테이블

컴파일을 하면 코드에서 함수를 호출하는 부분에 해당 함수가 저장된 메모리 주소 값이 저장된다.

 

프로그램 실행 → 함수 호출 함수가 저장된 주소로 점프 → 함수 실행 → 원래 위치

 

노란 표시를 한 부분이 바인딩(Binding)이다.

바인딩은 함수 호출 시 함수가 저장된 메모리 주소로 연결시켜주는 것이다.

 

  정적 바인딩 동적 바인딩
바인딩이 결정되는 시점 컴파일 컴파일 시 주소를 저장할 메모리 공간(4bytes)만 가지고 있다가 런타임에 결정
할당하는 것 일반 함수 가상 함수
장점 속도가 비교적 빠름, 안정적 실행 도중 호출하므로 유연함
단점 유연하지 않음 예상치 못한 타입의 경우 안정적

 

 

가상 함수 테이블

클래스에 가상 함수가 하나라도 있다면 컴파일러는 메모리 어딘가에 가상 함수 테이블을 만들고, 해당 클래스에 vfptr이라는 가상함수 테이블을 가리키는 함수포인터 변수를 만든다.

가상 함수의 갯수와 상관없이 가상 함수 테이블을 가리키는 변수는 vfptr 하나만 있으면 되기 때문에 클래스에는 4bytes만 늘어난다.

 

가상 함수를 가진 A 클래스를 B 클래스가 상속한 경우(부모 : A, 자식 : B)

 

B 객체 할당 시,  A 클래스의 가상 함수 테이블을 상속하면서, A 클래스의 가상 함수 중 B클래스에서 override(재정의)한 함수가 있다면 오버라이드한 함수를  다시 바인드해서 상속시켜준다. 오버라이드하지 않은 경우 그대로 둔다(A 클래스의 가상 함수가 호출된다).

+ A클래스의 일반 함수들은 정적 바인딩된다.

 

장점 : 다형성, 유연성

단점 : 가상 함수 테이블을 만들고, 가상 함수 수 만큼 배열이 만들어지고, 각 객체마다 가상 함수 테이블 포인터를 만들어줘야하므로 오버헤드 초래, 테이블을 이용해 주소를 찾아야하기 때문에 처리속도도 그만큼 늦어짐

 

 


참고

https://secretroute.tistory.com/entry/140819

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

더블 버퍼링과 스왑 체인  (0) 2020.02.17
게임에 디자인 패턴 적용하기  (0) 2020.02.17
BFS 구현 (큐)  (0) 2020.02.16
DFS 구현 (재귀, 스택)  (0) 2020.02.16
A* 알고리즘 설명  (0) 2020.02.16