Dlaczego Swift potrzebuje tabel świadków?

10

Próbuję przeczytać o szczegółach implementacji Swift, a jedną rzeczą, której nie mogę dopracować, są „tabele świadków”. Wygląda na to, że są one osobnym wskaźnikiem vtable używanym dla struktur.

Ale dlaczego miałbyś tego potrzebować? Struktury są kopiowane według wartości, więc wiesz już w czasie kompilacji, jakiego typu są. Czy nie po prostu napisałeś na stałe, którą metodę wywołać i skończyć z nią? Po co przeprowadzać wirtualną wysyłkę tymi metodami?

wszechstronność
źródło
1
Czy możesz wskazać niektóre zasoby w tych tabelach struktur świadków? Wszystko, co udało mi się znaleźć, to tabele świadków protokołu.
Jörg W Mittag,

Odpowiedzi:

12

Struktury mogą implementować interfejsy zwane protokołami w Swift. Możesz mieć parametr, zmienną lub pole / element będący protokołem, a ponieważ wiele różnych struktur, nie wspominając o klasach, może zaimplementować ten sam protokół po przekazaniu (lub przypisaniu) struktury do parametru protokołu (lub zmienna lub pole), specyfika tego, jaka to mogła być struktura, jest „zagubiona” (re: czas kompilacji) i wchodzi w grę tabela świadków protokołu (re: środowisko uruchomieniowe).

Możesz dowiedzieć się więcej o układzie pamięci Swift .


Podobnie dzieje się w języku C #, z którym jestem bardziej zaznajomiony. Struktura przekazana lub przypisana do zmiennej interfejsu lub pola / elementu jest zapakowana w ramkę, a reprezentacja struktury w ramce odpowiada reprezentacji klas, co oznacza, że ​​istnieje struktura vt dla struktur w ramkach.

Spodziewałbym się, że zarówno C #, jak i Swift będą wykonywać bezpośrednie połączenia, gdy element jest znany w czasie kompilacji jako struct, i użyją wysyłki w vtable, gdy w czasie kompilacji element jest znany tylko jako interfejs.

Erik Eidt
źródło
1
„Spodziewałbym się, że zarówno C #, jak i Swift będą wykonywać bezpośrednie połączenia, gdy element będzie znany w czasie kompilacji jako struct”, tak, jest to proces zwany dewiralizacją
Alexander - Przywróć Monikę
Powyższy link już nie działa. Prawdopodobnie chcesz odwołać się do github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst .
Martin R