Чому Свіфту потрібні столи свідків?


10

Я намагаюся прочитати деталі щодо впровадження Swift, і одне, чого я не можу визначити, - це його "таблиці свідків". Схоже, вони є окремим vtable-покажчиком, що використовується для структур.

Але навіщо вам це потрібно? Структури копіюються за значенням, тож ви вже знаєте під час компіляції, який вони тип. Тож чи не просто ви жорстко вкажете, який метод зателефонувати та зробити з ним? Навіщо виконувати віртуальну розсилку цими методами?


1
Чи можете ви вказати на якісь ресурси в цих структурах таблиць свідків? Все, що мені вдалося знайти, - це таблиці свідків протоколу.
Йорг W Міттаг

Відповіді:


12

Структури можуть реалізовувати інтерфейси, що називаються протоколами у Swift. Ви можете мати параметр, змінну або поле / член, який є протоколом, і, оскільки кілька різних структур, не кажучи вже про класи, можуть реалізувати той самий протокол, як тільки ви передасте (або призначите) структуру параметру протоколу (або змінна або поле), специфіка якої структури вона могла бути "втрачена" (re: час компіляції), і таблиця свідків протоколу вступає в гру (re: час виконання).

Ви можете дізнатися більше про компонування пам'яті Swift .


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

Я би сподівався, що і C #, і Swift здійснюватимуть прямі дзвінки, коли елемент відомий під час компіляції як структура, а також використовувати vtable-відправлення, коли під час компіляції елемент відомий лише як інтерфейс.


1
«Я очікую , як C # і Swift робити прямі дзвінки , коли елемент відомий під час компіляції , як структури,» так, це процес називається Реал
Олександр - відновить Моніку

Наведене посилання більше не працює. Напевно, ви хочете посилатися на github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst .
Мартін Р
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.