Perché Swift ha bisogno delle tabelle dei testimoni?


10

Sto cercando di leggere i dettagli di implementazione di Swift e una cosa che non riesco a definire sono le sue "tabelle dei testimoni". Sembra che siano un puntatore vtable separato usato per le strutture.

Ma perché dovresti averne bisogno? Le strutture sono copiate per valore, quindi sai già in fase di compilazione di che tipo sono. Quindi non dovresti semplicemente codificare quale metodo chiamare ed essere fatto con esso? Perché eseguire l'invio virtuale su questi metodi?


1
Puoi indicare alcune risorse su quelle tabelle dei testimoni della struttura? Tutto quello che sono stato in grado di trovare sono le tabelle dei test di protocollo.
Jörg W Mittag,

Risposte:


12

Le strutture possono implementare interfacce, chiamate protocolli in Swift. Puoi avere un parametro, una variabile o un campo / membro che è un protocollo e, poiché più strutture diverse, per non parlare delle classi, possono implementare lo stesso protocollo, una volta passato (o assegnato) una struttura a un parametro di protocollo (o variabile o campo), le specifiche di quale struttura potrebbe essere stata "persa" (re: tempo di compilazione) ed entra in gioco la tabella di controllo del protocollo (re: runtime).

Puoi saperne di più sul layout della memoria di Swift .


Simile succede in C #, con cui ho più familiarità. Una struttura passata o assegnata a una variabile di interfaccia o campo / membro viene inscatolata e la rappresentazione inscatolata della struttura corrisponde a quella delle rappresentazioni di classe, il che significa che esiste una tabella per le strutture inscatolate.

Mi aspetterei che sia C # sia Swift effettuino chiamate dirette quando l'elemento è noto al momento della compilazione come struttura e che utilizzi l'invio di vtable quando al momento della compilazione l'elemento è noto solo come interfaccia.


1
"Mi aspetterei che sia C # sia Swift effettuino chiamate dirette quando l'elemento è noto al momento della compilazione come una struttura", sì, questo è un processo chiamato devirtualizzazione
Alexander -

Il link sopra non funziona più. Probabilmente vuoi fare riferimento a github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst .
Martin R,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.