Зачем Свифту нужны свидетели?

10

Я пытаюсь прочитать подробности реализации Swift, и одну вещь, которую я не могу прибить, - это «таблицы свидетелей». Похоже, это отдельный указатель vtable, используемый для структур.

Но зачем тебе это? Структуры копируются по значению, так что вы уже знаете во время компиляции, какого они типа. Так разве вы не просто жестко прописали какой метод вызывать и что с ним делать? Зачем выполнять виртуальную рассылку по этим методам?

uliwitness
источник
1
Можете ли вы указать на некоторые ресурсы в этих таблицах структурных свидетелей? Все, что мне удалось найти, это таблицы свидетелей протокола.
Йорг Миттаг,

Ответы:

12

Структуры могут реализовывать интерфейсы, называемые протоколами в Swift. У вас может быть параметр, переменная или поле / член, являющийся протоколом, и, поскольку несколько различных структур, не говоря уже о классах, могут реализовывать этот же протокол после передачи (или назначения) структуры параметру протокола (или переменная или поле), специфика того, какой структурой он мог бы быть, «потеряна» (время повторной компиляции) и вступает в игру таблица-свидетель протокола (время выполнения: повторная)

Вы можете узнать больше о разметке памяти Swift .


Подобное происходит в C #, с которым я более знаком. Структура, передаваемая или присваиваемая переменной интерфейса или полю / члену, упакована в штучной упаковке, и представление в штучной упаковке структуры соответствует представлению класса, что означает, что существует структура для коробчатых структур.

Я ожидаю, что и C #, и Swift будут делать прямые вызовы, когда элемент известен во время компиляции как структура, и использовать vtable dispatch, когда во время компиляции элемент известен только как интерфейс.

Эрик Эйдт
источник
1
«Я ожидал бы, что и C #, и Swift будут выполнять прямые вызовы, когда элемент известен во время компиляции как структура», да, это процесс, называемый девиртуализацией
Александр - восстановите Monica
Приведенная выше ссылка больше не работает. Вы, вероятно, хотите сослаться на github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst .
Мартин Р