본문 바로가기

CS공부

가상 메소드 테이블(Virtual method table)

가상 메소드 테이블이란?

가상 메소드 테이블은 동적 디스패치를 지원하기 위해 프로그래밍 언어에서 사용되는 메커니즘이다. 클래스가 가상 함수을 정의할 때마다, 대부분의 컴파일러들은 클래스에 숨겨진 멤버 변수를 추가하는데, 이것은 함수들에 대한 포인터들의 배열들을 가리킨다

 

이 부분을 이해하기위해 클래스에 함수가 동작하는 메모리 방식을 이해해야하는데 

제가 그림툴을 잘 못써서 직접 적어서 보여드리면

그냥 주저리 주저리 설명을 드리면

클래스를 상속받은 변수 A에서 test라는 함수를 실행을 시키게되면 데이터영역에 클래스의 함수를 찾아가고 그 함수는 코드영역의 메모리 주소값을 찾아가 코드를 실행시키는 과정이 일어난다. 자세한 설명이 필요하다면 다른자료 or 앨런님의 강의를...!

 

그럼 본론으로 돌아가 가상 함수 테이블에 대한 글을 적어보려 한다.

 

가상 함수 테이블은 상속을 받은 부모의 객체에 있는 함수 자식이 가지고 숨겨서 가지고 있다 라는거라고 생각을하면 되는데 흐음.. 이걸 어떻게 이야기를 해야할지 조금 애매하다

 

https://jcsoohwancho.github.io/2019-11-02-Message-Dispatch/

 

Message Dispatch

지난 포스트에서 Dispatch 규칙에 대해서 알아보았습니다. 이번 포스트에서는 Swift가 지원하는 또 하나의 Dispatch 방법인 Message Dispatch와 이를 활용하는 방법에 대해서 알아 보겠습니다. Message Dispatch

jcsoohwancho.github.io

https://cosyp.tistory.com/228

 

가상함수(Virtual function)와 가상함수테이블(vtable)의 이해

오버라이딩(Overriding) 가상함수를 이해하기 위해선 오버라이딩(Overriding) 에 대해서 알아야 한다. SourceCode(1) class Parent{ void show(){ printf("this is parent\n"); } } class Child : public Parent{..

cosyp.tistory.com

 

https://ko.wikipedia.org/wiki/%EA%B0%80%EC%83%81_%EB%A9%94%EC%86%8C%EB%93%9C_%ED%85%8C%EC%9D%B4%EB%B8%94

 

가상 메소드 테이블 - 위키백과, 우리 모두의 백과사전

가상 메소드 테이블({{{2}}}, 디스패치 테이블, vtable, 또는 vftable)은 동적 디스패치(또는 런타임 메소드 바인딩)를 지원하기 위해 프로그래밍 언어에서 사용되는 메커니즘이다. 클래스가 가상 함

ko.wikipedia.org

글로 적는 재주가 없어 설명은 위의 블로그와 나무위키의 자료를 읽어보면 큰 도움이 될거라 도움이된다.

 

class ParentClass {
    
    func address(of object: UnsafeRawPointer) -> String{
        let address = Int(bitPattern: object)
        return String(format: "%p", address)
    }
    
    func TestFunction(){
        
    }

    func OverrideTestFunction(){
        
    }
}


class ChildClass : ParentClass{
    
    override func OverrideTestFunction() {
        
        
    }
}

 

이런 클래스가 있다고 가정해보자

ChildClass의 OverrideTestFunction 이 실행을 시키면 DynamicDispatch로 실행할때 어떤 OverrideTestFunction 실행할지를 결정한다고 했죠?

근데 그 어떤 OverrideTestFunction 를 어디서 찾냐? 그걸 가지고 있는게 바로 vtable입니다 그래서 vtable에 함수들이 들어있고 그 함수들중 DynamicDispatch로 진행되는 함수들이 적재적소의 위치에 사용될 수 있게 도움을 준다.

흐음 머리로는 어떤 구조인지 알겠는데 글로 쓸려고하니 좀 횡설 수설 이상해지는데 제가 첨부해놓은 글들을 보시면 좀 더 좋은 이해가 되실거라고 믿습니다!