모두의 코드 내용을 공부하고 정리한 내용입니다.



바인딩

  • c++ 컴파일러는 함수를 호출할 때 어디에 있는 함수인지 그리고 해당 함수가 저장된 메모리 위치까지 확인한다. 이 때 함수를 호출하는 부분에서 어디에 저장된 함수를 실행하라 연결짓는 것을 바인딩이라고 한다.


  • 정적바인딩 : 실행시간(런타임) 전에 일어나고 실행 시간에 변하지 않은 상태로 유지된다
    • 빠르다.
      • 이미 빌드 떄부터 결정이 되어서
    • 실행 전에 미리 다 정의되어서 유연성이 떨어진다.


  • 동적바인딩 : 실행시간(런타임)에 이루어지거나 실행 시간에 변경될 수 있는 바인딩
    • 느리다. 오버헤드가 존재한다.
      • 런타임 중에 함수의 포인터를 보고 직접 함수를 찾아가 실행해야 해서


  • 보통의 함수는 컴파일 타임에 고정된 메모리 주소에 위치한다.
  • C++에서 가상함수가 아닌 함수들은 모두 정적 바인딩을 한다.
    • 하지만 가상 함수도 결합하는 타입이 분명할 때는 정적 바인딩을 한다.



가상 함수 테이블

  • 컴파일러마다 다르지만 기본적인 가상 함수 컨트롤 방식은 가상 함수 테이블을 이용.
  • 가상 함수를 선언시 가상 함수 테이블을을 만들어 동적 바인딩을 한다.
  • 그렇게 가상 함수가 있는 클래스의 객체를 생성 하면 가상 함수 테이블와 해당 테이블을을 가르키는 포인터가 생성된다.


  • 가상 함수를 호출하면 보통의 함수와 달리 가상 함수 테이블을 거치는 작업을 통해 함수를 선택하게 된다.


  • 포인터 변수일 경우 포인트 타입이 아닌
    • 가르키는 객체의 타입을 보고 호출한다.



참조


카테고리:

업데이트:

댓글남기기