 
## Диспетчеризация

1. [iOS-Инкубатор. Диспетчеризация в iOS](https://hackmd.io/@leonovka/B1IaedbHs)
2. [Диспетчеризация методов в Swift](https://habr.com/ru/articles/714830/)
3. [Диспетчеризация методов iOS](https://habr.com/ru/articles/677616/)

> Диспетчеризацией методов называют процесс поиска адреса инструкций, которые нужно выполнить CPU при вызове определенного метода (какую имплементацию система вызовет у метода).

Другими словами, цель диспетчеризации методов состоит в том, чтобы **программа сообщала процессору, где он может найти исполняемый код конкретного метода в памяти**.

Диспетчеризация происходит каждый раз, когда вызывается метод:

<img src="https://habrastorage.org/getpro/habr/upload_files/a12/221/b3c/a12221b3cd7f8d47cd3345d6d313bdfb.png" alt="alt text" width="350" height="250">

## Виды диспетчеризации

Основные виды диспетчеризации:
* **Java**: табличная (по дефолту) / статическая через final
* **C++**: статическая (по дефолту) / табличная через virtual
* **Objective-C**: на сообщениях
  * Из-за поддержки ЯП `C` можно исп-ть и static
* **Swift**: есть все виды

<img src="https://hsto.org/getpro/habr/upload_files/17e/f12/078/17ef120789f74352f33c617df5996a4b.png" alt="alt text" width="600" height="250">



## Оптимизация диспетчеризации вызовов

[Данная статья Apple](https://developer.apple.com/swift/blog/?id=27) более подробно рассказывает про способы повышения производительности, уменьшая использование табличной диспетчеризации.

Для повышения производительности, задача компилятора и разработчика заключается в том, чтобы, как можно больше методов использовали статическую диспетчеризацию, в этом нам поможет следующие ключевые слова:

  I. final  не позволяет наследоваться классам (override), а методам переопределяться, что приводит к статической диспетчеризации

    Пример:
    ```swift
    final class MyClass() {
        func someMethod() {
            print("Direct Dispatch")
        }
    }
    ```

  II. `private` ограничивает видимость метода или всего класса. Отсутствие каких-либо переопределений позволяет компилятору автоматически добавлять ключевое слово final

  III. [Whole Module Optimization](https://github.com/apple/swift/blob/main/docs/Lexicon.md#wmo-whole-module-optimization) позволяет компилятору просматривать все исходные файлы в едином модуле (все файлы в модуле компилируются в одном процессе), проверяются и оптимизируются вместе на уровне [SIL](https://github.com/apple/swift/blob/main/docs/SIL.rst) в [Swift](/5%20Swift/5.1%20Swift.md). Это позволяет компилятору использовать final для всех методов без переопределений.

## Общие правила диспетчеризации на рисунке:

![Dispatch scheme](https://habrastorage.org/getpro/habr/upload_files/21e/9c1/138/21e9c1138c6b0eb862d264ce5fb1b221.png)

---

[5.6 Method Dispatch Theme Folder](/5%20Swift/5.6%20MethodDispatch/) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [5.6.2 Static(direct) Dispatch Theme ](./5.6.2%20Static(direct)Dispatch.md)
