Por que o Swift precisa de tabelas de testemunhas?


10

Estou tentando ler os detalhes de implementação do Swift, e uma coisa que não consigo identificar são as "tabelas de testemunhas". Parece que eles são um ponteiro vtable separado usado para estruturas.

Mas por que você precisaria disso? As estruturas são copiadas por valor, para que você já saiba em tempo de compilação que tipo elas são. Então você não codifica qual método chamar e termina com ele? Por que executar o despacho virtual nesses métodos?


1
Você pode apontar para alguns recursos nessas tabelas de testemunha struct? Tudo o que consegui encontrar são tabelas de testemunhas de protocolo.
Jörg W Mittag

Respostas:


12

As estruturas podem implementar interfaces, chamadas protocolos no Swift. Você pode ter um parâmetro, variável ou campo / membro que seja um protocolo e, porque várias estruturas diferentes, para não mencionar classes, podem implementar o mesmo protocolo, depois de passar (ou atribuir) uma estrutura a um parâmetro de protocolo (ou variável ou campo), as especificidades de qual estrutura ela poderia ter sido "perdida" (tempo de re: compilação) e a tabela testemunha de protocolo entra em jogo (re: tempo de execução).

Você pode aprender mais sobre o layout da memória Swift .


Semelhante acontece em C #, com o qual estou mais familiarizado. Uma estrutura passada ou atribuída a uma variável de interface ou campo / membro é fornecida em caixa e a representação em caixa da estrutura corresponde à das representações de classe, o que significa que existe uma tabela de estruturas para estruturas em caixa.

Eu esperaria que o C # e o Swift fizessem chamadas diretas quando o item for conhecido no tempo de compilação como uma estrutura e usem o envio de vtable quando, no tempo de compilação, o item seja conhecido apenas como interface.


1
"Eu esperaria que o C # e o Swift fizessem chamadas diretas quando o item for conhecido no tempo de compilação como uma estrutura", sim, esse é um processo chamado de desvirtualização
Alexander - Reinstate Monica

O link acima não funciona mais. Você provavelmente deseja fazer referência ao github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst .
Martin R
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.