Я пытаюсь прочитать подробности реализации Swift, и одну вещь, которую я не могу прибить, - это «таблицы свидетелей». Похоже, это отдельный указатель vtable, используемый для структур.
Но зачем тебе это? Структуры копируются по значению, так что вы уже знаете во время компиляции, какого они типа. Так разве вы не просто жестко прописали какой метод вызывать и что с ним делать? Зачем выполнять виртуальную рассылку по этим методам?
language-design
swift-language
uliwitness
источник
источник
Ответы:
Структуры могут реализовывать интерфейсы, называемые протоколами в Swift. У вас может быть параметр, переменная или поле / член, являющийся протоколом, и, поскольку несколько различных структур, не говоря уже о классах, могут реализовывать этот же протокол после передачи (или назначения) структуры параметру протокола (или переменная или поле), специфика того, какой структурой он мог бы быть, «потеряна» (время повторной компиляции) и вступает в игру таблица-свидетель протокола (время выполнения: повторная)
Вы можете узнать больше о разметке памяти Swift .
Подобное происходит в C #, с которым я более знаком. Структура, передаваемая или присваиваемая переменной интерфейса или полю / члену, упакована в штучной упаковке, и представление в штучной упаковке структуры соответствует представлению класса, что означает, что существует структура для коробчатых структур.
Я ожидаю, что и C #, и Swift будут делать прямые вызовы, когда элемент известен во время компиляции как структура, и использовать vtable dispatch, когда во время компиляции элемент известен только как интерфейс.
источник