ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1066) N
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (179) N
      • Unreal (69)
      • Unity (99) N
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • C
  • 함수
  • 그래픽스
  • 파이썬
  • c#
  • 배열
  • 언리얼
  • SQL
  • 유니티
  • 오블완
  • 문자열
  • 알고리즘
  • 포인터
  • C++
  • 백준
  • 클래스
  • Unity
  • 프로그래머스
  • 티스토리챌린지
  • string

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

C++ 가상함수 테이블 (Virtual Table)
프로그래밍 언어/C++

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

2022. 6. 13. 16:05
#include <iostream>
 
using namespace std;
 
class A
{
public:
    virtual void Func1()
    {
        cout << "This is Func1 from A class" << endl;
    }
 
    void Func2()
    {
        cout << "This is Func2" << endl;
    }
};
 
class B : public A
{
public:
    virtual void Func1() override
    {
        cout << "This is Func1 from B class" << endl;
    }
 
    void Func3()
    {
        cout << "This is Func3" << endl;
    }
};
 
int main()
{
    // A 클래스 포인터 생성
    A* p_a = new A();
 
    // A클래스에 대한 포인터를 자식 B 클래스로 생성
    A* p_a2 = new B();
 
    B* p_b = static_cast<B*>(new A());
 
    p_a->Func1();
    p_a->Func2();
    
    p_a2->Func1();
    static_cast<B*>(p_a2)->Func3();
 
    p_b->Func1();
 
    delete p_a;
    delete p_a2;
    delete p_b;
    return 0;
}

Func1은 가상 함수이고

Func2는 클래스 A의 멤버 함수, Func3는 클래스 B의 멤버 함수이다.

 

먼저 클래스 A를 보면 virtual로 선언된 가상 함수가 존재한다. 

이렇게 한 개 이상의 가상 함수를 포함하는 클래스에 대해서는 컴파일러가 다음과 같은 형태의 '가상함수 테이블'을 만든다.

가상함수 테이블을 보면, key와 value가 있다.

key에는 호출하고자 하는 함수를 구분 지어주는 식별자이고,

value는 구분자에 해당하는 함수의 주소이다.

 

만약 A 객체를 생성하면 객체에 A 클래스의 가상 함수 테이블의 주소 값이 저장된다.

그럼 A 객체의 Func1 함수 호출 시 다음과 같은 참조 과정을 가진다.

 

A 객체의 Func1 호출! -> A 클래스의 가상 함수 테이블의 주소 참조! -> 0x1024번지 참조! 

 

그럼 클래스 B는 가상함수 테이블이 어떻게 생성이 될까?

B 클래스의 가상함수 테이블을 보면 A 클래스의 Func1에 대한 정보가 존재하지 않는 것을 확인할 수 있다.

이렇듯, 오버 라이딩된 가상 함수의 주소정보는 유도 클래스의 가상함수 테이블에 포함되지 않는다.

 

C++는 이런 가상함수 테이블( V-Table / Virtual Table)이 있어서, 클래스에 가상 함수가 포함되면, 가상함수 테이블이 생성되고, 또 이 테이블을 참조하여 호출될 함수가 결정되기에 C에 비해 실행 속도가 더 느리다. 하지만 가상 함수는 많은 장점을 제공하기에 유용하게 활용되고 있다.

 

출처 : https://musket-ade.tistory.com/entry/C-가상함수-테이블-V-Table

저작자표시 (새창열림)

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ 출력(std::format)과 for-range loop 꿀팁  (0) 2022.06.14
C++ RVO NRVO 반환값 최적화 / Copy Elision(복사 생략)  (0) 2022.06.14
C++ 캐스팅 static_cast / reinterpret_cast 예제  (0) 2022.06.10
C++ SFINAE 여러 타입에 대응하는 템플릿 오버로딩  (0) 2022.06.10
C++ 콜백 CallBack 함수  (0) 2022.06.09
    '프로그래밍 언어/C++' 카테고리의 다른 글
    • C++ 출력(std::format)과 for-range loop 꿀팁
    • C++ RVO NRVO 반환값 최적화 / Copy Elision(복사 생략)
    • C++ 캐스팅 static_cast / reinterpret_cast 예제
    • C++ SFINAE 여러 타입에 대응하는 템플릿 오버로딩
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바