https://github.com/apple/swift/blob/main/docs/OptimizationTips.rst#reducing-dynamic-dispatch
클래스는 기본적으로 메서드나 프로퍼티에 접근할 때
dynamic dispatch를 이용한다
dynamic dispatch는 기본적으로
indirect invocation through a vTable.
만약 선언 시 dynamic
키워드를 사용하면,
swift will emit calls via Obj-C message send instead.
when you know the declaration does NOT need to be overridden
final
키워드는 클래스, 메서드, 프로퍼티의 선언을 제약한다// 1.
final class C { // C 내에서 선언한 것들은 재정의할 수 없다
var array1: [Int]
func doSomething() { ... }
}
// 2.
class D { // array2는 재정의가 가능하지만, array1은 불가능하다 (연산 프로퍼티로써 재정의)
final var array1: [Int]
var array2: [Int]
}
// 1 - 1.
func usingC(_ c: C) {
// Can directly access C.array without going through dynamic dispatch
c.array[1]
// Can directly call C.doSomething without going through virtual dispatch
c.doSomething()
}
// 2 - 1.
func usingD(_ d: D) {
// Can directly access D.array1 without going through dynamic dispatch
d.array1[i] = ...
// Will access D.array2 through dynamic dispatch
d.array2[i] = ...
}
when declaration does NOT need to be accessed outside of file
private
이나 fileprivate
키워드는 선언 시
visibility of the declaration을 그 파일 내로 제약시킨다
이것은 컴파일러가 확신하게 한다
all other potentially overriding declarations
Thus the absence of any such declarations enables the compiler to infer the final
keyword automatically and remove indirect calls for methods and field accessses accordingly.
어쨌든, 하나의 클래스만 정의되어 있는 file 내에서 private
키워드를 사용하면, 사실상 override
될 가능성이 없기 때문에 내부적으로 final
키워드를 유추할 수 있다. 결과적으로 static dispatch 형태로 실행된다
private class E {
func doSomething() { ... }
}
class F {
fileprivae var myPrivateVar: Int
}
func usingE(_ e: E) {
e.doSomething()
}
// There is NO subclass in the file that declares this class
// The compiler can remove virtual calls to doSomething()
// and directly call E's doSomething method
func usingF(_ f: F) -> Int {
return f.myPrivateVar
}
when declaration does NOT need to be accessed outside of module
WMO (World Meal Organization)
internal
declaration은 현재 모듈 밖에서는 볼 수 없기 때문에,final
by automatically discovering all potentially overriding declarations