Protocol Type 전까지
값 또는 참조 의미 체계가 더 적절합니까?
WWDC - Understanding Swift Performance
디스패치: 어떤 메서드를 호출 할 것인지를 결정하여, 그것을 실행하는 메커니즘(호출될 함수를 런타임에 결정할것이냐, 컴파일타임에 결정할 것이냐)
Static Dispatch (Direct Call)
컴파일 타임
에 호출될 함수를 결정하여, 런타임 때 그대로 실행한다
컴파일 타임에 결정이 나기 때문에 성능상 이점을 가질 수 있음
Dynamic Dispatch (Indirect Call)
런타임
에 호출될 함수를 결정
때문에 Swift에서는 클래스마다 함수 포인터들의 배열인 vTable(Virtual Methon Table)이라는 것을 유지함
하위 클래스가 메서드를 호출할 때, 이 vTable
를 참조하여 실제 호출할 함수를 결정함
이 과정들이 런타임
에 일어나기 때문에 성능상 손해를 보게 됨
class Human {
func sayHello() {
print("Hello Human!")
}
}
class Teacher: Human {
override func sayHello() {
print("Hello Teacher!")
}
}
컴파일러는 클래스의 메서드가 하위 클래스에서 오버라이딩이 될 경우를 대비해, 상위 클래스의 sayHello를 참조해야 하는지, 하위 클래스의 sayHello를 참조해야 하는지를 확인하는 작업을 런타임
에 해야함
모든 하위 클래스에는 고유한 상위 클래스의 vTable 복사본이 있음
vTable에는 이 클래스에서 오버라이딩 한 모든 메서드들을 가리키는 함수 포인터가 있음
클래스 인스턴스의 함수를 호출할 때, 실제 오버라이딩이 된지 안 된지는 따지지 않고 무조건 vTable을 확인해서 참조함
힙 낮은 메모리 주소
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
스택 높은 메모리 주소