C++/Class 2021. 3. 20. 17:49

가상 (함수) 테이블 (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
    */