Ответ
Direct Dispatch (Статическая диспетчеризация) — это самый быстрый механизм вызова метода, при котором адрес функции известен во время компиляции. Компилятор подставляет прямой вызов или даже инлайнит код, минуя поиск по таблицам.
Когда компилятор Swift использует Direct Dispatch:
- Для всех вызовов глобальных функций.
- Для методов и свойств, объявленных как
final. - Для методов в
structиenum(так как они не поддерживают наследование). - Для методов, помеченных как
privateилиfileprivateв классе, если компилятор может доказать, что они не переопределяются. - Для
staticметодов и свойств.
Пример:
final class NetworkService { // final класс не может иметь наследников
func sendRequest() { // Этот метод будет диспетчеризован напрямую
print("Sending request...")
}
}
struct Calculator { // Структуры всегда используют direct dispatch
func add(_ a: Int, _ b: Int) -> Int { return a + b }
}
let service = NetworkService()
service.sendRequest() // Direct Dispatch: вызов происходит напрямую
let calc = Calculator()
calc.add(5, 3) // Direct Dispatch
| Сравнение с другими типами диспетчеризации: | Тип | Скорость | Динамичность | Пример в Swift |
|---|---|---|---|---|
| Direct | ⚡️ Самый быстрый | Нет | final методы, struct |
|
| Table (Virtual) | Быстрая | Да (наследование) | Обычные методы класса | |
| Message | Медленнее | Максимальная (KVO, swizzling) | Методы, унаследованные от NSObject |
Преимущества Direct Dispatch:
- Максимальная производительность: Нет накладных расходов на поиск в таблице виртуальных функций.
- Возможности оптимизации: Компилятор может применить инлайнинг и другие агрессивные оптимизации.
Недостаток:
- Отсутствие полиморфизма — метод не может быть переопределен в подклассе (что и является целью
final).