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?
language-design
swift-language
wszechstronność
źródło
źródło
Odpowiedzi:
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.
źródło