Виртуальная таблица (vtable) используется для реализации полиморфизма в объектно-ориентированных языках программирования, включая Swift для классов. Она содержит указатели на функции (методы) класса, которые могут быть переопределены в подклассах. При вызове метода через указатель на базовый класс, система смотрит в vtable объекта, чтобы определить, какая именно реализация метода должна быть вызвана (из базового или переопределенного в подклассе).
Таблица свидетельств (witness table) используется в Swift для протоколов. Она содержит указатели на реализации требований протокола (свойства, методы, ассоциированные типы) для конкретного типа, который соответствует этому протоколу. Когда функция, принимающая аргумент типа протокола, вызывается, система использует witness table, связанную с переданным объектом, чтобы получить доступ к конкретным реализациям требований протокола для этого типа. Witness table позволяет Swift осуществлять динамическую диспетчеризацию для протоколов без накладных расходов, связанных с vtable для классов, и поддерживает гибкость протоколов.
Основные отличия:
| Признак | Виртуальная таблица (vtable) | Таблица свидетельств (witness table) |
|---|---|---|
| Применяется для | Классы | Протоколы |
| Содержит | Указатели на методы класса | Указатели на реализации требований протокола для типа |
| Механизм | Наследование | Соответствие протоколу |
| Полиморфизм | Полиморфизм подтипов | Протокольный полиморфизм |