C++ 가상 (함수) 테이블 (Virtual Tables)

2021. 3. 20. 17:49·SW개발/C++
반응형

가상 (함수) 테이블 (Virtual Tables)

  • virtual 키워드를 사용하면 내부적으로 가상 테이블의 주소가 저장된다.

예제

간단한 상속 예제

  class Base
  {
  public:
    // FunctionPointer *_vptr;
    virtual void func1() {}
    virtual void func2() {}
  };

  class Derived : public Base
  {
  public:
    // FunctionPointer *_vptr;
    virtual void func1() {}
  };
  • 여기서 클래스들의 가상 테이블은 다음과 같다.

    Base VTable 가리키고 있는 함수
    func1 Base::func1
    func2 Base::func2

    Derived VTable 가리키고 있는 함수
    func1 Derived::func1
    func2 Base::func2

사이즈 출력해보기

  • 가상 함수를 사용하지 않는 경우

    • 객체의 크기가 1바이트씩 나온다.
    #include <iostream>
    
    class Base
    {
    public:
      // FunctionPointer *_vptr;
      void func1() {}
      void func2() {}
    };
    
    class Derived : public Base
    {
    public:
      // FunctionPointer *_vptr;
      void func1() {}
    };
    
    int            main()
    {
      using namespace std;
    
      cout << sizeof(Base) << endl;
      cout << sizeof(Derived) << endl;
    }
    
    /* stdout
    1
    1
    */
  • 가상 함수를 사용할 경우

    • x86에서는 4바이트, x64에서는 8바이트가 나온다.

      • 이는 주소의 크기이다.
    #include <iostream>
    
    class Base
    {
    public:
      // FunctionPointer *_vptr;
      virtual void func1() {}
      virtual void func2() {}
    };
    
    class Derived : public Base
    {
    public:
      // FunctionPointer *_vptr;
      virtual void func1() {}
    };
    
    int            main()
    {
      using namespace std;
    
      cout << sizeof(Base) << endl;
      cout << sizeof(Derived) << endl;
    }
    
    /* stdout (x86)
    4
    4
    */
    
    /* stdout (x64)
    8
    8
    */
반응형
저작자표시 (새창열림)

'SW개발 > C++' 카테고리의 다른 글

C++ 추상 기본 클래스 (Abstract class)  (0) 2021.03.21
C++ 순수 가상 함수 (Pure Virtual Function)  (0) 2021.03.21
C++ 동적 바인딩 (Dynamic Binding)  (0) 2021.03.20
C++ 정적 바인딩 (Static Binding)  (0) 2021.03.20
C++ 가상 소멸자  (0) 2021.03.20
'SW개발/C++' 카테고리의 다른 글
  • C++ 추상 기본 클래스 (Abstract class)
  • C++ 순수 가상 함수 (Pure Virtual Function)
  • C++ 동적 바인딩 (Dynamic Binding)
  • C++ 정적 바인딩 (Static Binding)
Caniro
Caniro
  • Caniro
    Minimalism
    Caniro
  • 전체
    오늘
    어제
    • 전체보기 (319)
      • SW개발 (268)
        • Java Spring (6)
        • C++ (186)
        • Python (21)
        • Linux (16)
        • 알고리즘 (13)
        • Git (4)
        • Embedded (1)
        • Raspberrypi (9)
        • React (3)
        • Web (2)
        • Windows Device Driver (6)
      • IT(개발아님) (46)
        • Windows (26)
        • MacOS (7)
        • Utility (11)
      • 챗봇 짬통 (0)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    제외
    windows
    시스템 복구
    Windows 11
    윈도우
    vscode
    MacOS
    SFC
    맥북 카카오톡 알림 안뜸
    스프링
    스프링 프레임워크 핵심 기술
    java
    Workspace
    dism
    윈도우 명령어
    Solaris 10
    SunOS 5.1
    KakaoTalk
    로지텍 마우스 제스처
    logi options
    spring
    알림
    그림판
    unix
    EXCLUDE
    백기선
    citrix workspace
    mspaint
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Caniro
C++ 가상 (함수) 테이블 (Virtual Tables)
상단으로

티스토리툴바