TIL76 ✨

YaR Lab·2023년 8월 7일
0

TIL✨

목록 보기
64/135
post-thumbnail

🗓️23.08.07

Protocol Type 전까지

값 또는 참조 의미 체계가 더 적절합니까?

WWDC - Understanding Swift Performance

📌 정적 디스패치 vs 동적 디스패치

  • 디스패치: 어떤 메서드를 호출 할 것인지를 결정하여, 그것을 실행하는 메커니즘(호출될 함수를 런타임에 결정할것이냐, 컴파일타임에 결정할 것이냐)

  • 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을 확인해서 참조함

📌 높은 메모리주소 vs 낮은 메모리 주소

힙 낮은 메모리 주소
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼



▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
스택 높은 메모리 주소

📌 구조체 선언

  • 데이터를 스택에 저장

📌 Class 선언

  • 데이터(실제 데이터 + 메타 데이터 + 참조 카운트)는 heap에 저장 됨
  • stack에 실제 데이터가 저장돼있는 heap 메모리 주소가 저장 됨

0개의 댓글