바인딩 & 가상 함수 테이블
모두의 코드 내용을 공부하고 정리한 내용입니다.
바인딩
- c++ 컴파일러는 함수를 호출할 때 어디에 있는 함수인지 그리고 해당 함수가 저장된 메모리 위치까지 확인한다. 이 때 함수를 호출하는 부분에서 어디에 저장된 함수를 실행하라 연결짓는 것을 바인딩이라고 한다.
- 정적바인딩 : 실행시간(런타임) 전에 일어나고 실행 시간에 변하지 않은 상태로 유지된다
- 빠르다.
- 이미 빌드 떄부터 결정이 되어서
- 실행 전에 미리 다 정의되어서 유연성이 떨어진다.
- 빠르다.
- 동적바인딩 : 실행시간(런타임)에 이루어지거나 실행 시간에 변경될 수 있는 바인딩
- 느리다. 오버헤드가 존재한다.
- 런타임 중에 함수의 포인터를 보고 직접 함수를 찾아가 실행해야 해서
- 느리다. 오버헤드가 존재한다.
- 보통의 함수는 컴파일 타임에 고정된 메모리 주소에 위치한다.
- C++에서 가상함수가 아닌 함수들은 모두 정적 바인딩을 한다.
- 하지만 가상 함수도 결합하는 타입이 분명할 때는 정적 바인딩을 한다.
가상 함수 테이블
- 컴파일러마다 다르지만 기본적인 가상 함수 컨트롤 방식은 가상 함수 테이블을 이용.
- 가상 함수를 선언시 가상 함수 테이블을을 만들어 동적 바인딩을 한다.
- 그렇게 가상 함수가 있는 클래스의 객체를 생성 하면 가상 함수 테이블와 해당 테이블을을 가르키는 포인터가 생성된다.
- 가상 함수를 호출하면 보통의 함수와 달리 가상 함수 테이블을 거치는 작업을 통해 함수를 선택하게 된다.
- 포인터 변수일 경우 포인트 타입이 아닌
- 가르키는 객체의 타입을 보고 호출한다.
댓글남기기