Programing Langauge/swift
디스패치 학습하기 (1) [ 정의, 종류, vtable, witness table ]
Hamp
2024. 8. 25. 22:51
반응형

디스패치란
Dispatch란 어떤 메서드를 호출한 것인지를 결정하여 그것을 실행시키는 메커니즘입니다.
Dispatch는 2가지 종류가 있는데 구분하는 기준은 내가 호출한 함수를 컴파일 타임에 결정하냐
런타임에 결정하냐에 따른 방식으로 나뉩니다.
종류
| Static Dispatch (Direct Call) | Dynamic Dispatch (Indirect Call) | |
| 호출 함수 결정 시기 | 컴파일 타임에 결정 | 런타임에 호출될 함수 결정 |
| 속도 | 매우 빠름 | static Dispatch 보다 느림 |
| 사용 타입 | 값 타임에 사용 | 래퍼런스 타입 |
| vTable 사용 | X | O |
vTable vs Witness Table
디스패쳐 설명에 들어가기 전에 알고가면 좋은 Table 두개가 있다.
각 Table의 역할을 보고 추후 Dispatch 설명 관련에 등장할 때 당황하지 말자.


| vTable(Virtual Table) | Witness Table | |
| 사용 목적 | 클래스에서 메소드 호출을 동적으로 하기위해 사용 | 프로토콜을 준수하는 타입이 요구 사항을 어떻게 구현하는지 기록 |
| 구조 | 각 클래스는 vtable을 갖고 있으며, vtable은 오버라이드된 메소드들에 대한 포인터를 포함 |
프로토콜의 요구 사항을 구현하는 방법을 witness Table에 기록 |
| 동작 방식 | 메소드가 호출될 때, 객체의 vtable을 참조하여 런타임에 메소드를 결정. |
메소드가 호출될 때 구현체 타입의 witness Table을 참조하여 결정 |
| 공통점 | 둘다 dynamic dispatch를 지원하여 런타임 중 메소드 호출을 동적으로 결정 호출할 메소드의 실제 주소를 테이블을 통해 찾음 |
|
| 차이점 | vtable은 상속과 메소드 오버라이딩을 지원하며, Witness Table은 프로토콜 요구 사항을 구현하는 방법을 기록. | |
반응형