¿Por qué Swift necesita tablas de testigos?


10

Estoy tratando de leer los detalles de implementación de Swift, y una cosa que no puedo precisar son sus "tablas de testigos". Parece que son un puntero vtable separado utilizado para estructuras.

¿Pero por qué necesitarías eso? Las estructuras se copian por valor, por lo que ya sabe en tiempo de compilación de qué tipo son. Entonces, ¿no codificarías a qué método llamar y terminar con él? ¿Por qué realizar despacho virtual en estos métodos?


1
¿Puede señalar algunos recursos en esas tablas de testigos de estructura? Todo lo que he podido encontrar son tablas de testigos de protocolo.
Jörg W Mittag

Respuestas:


12

Las estructuras pueden implementar interfaces, llamadas protocolos en Swift. Puede tener un parámetro, variable o campo / miembro que sea un protocolo y, debido a que varias estructuras diferentes, sin mencionar las clases, puede implementar ese mismo protocolo, una vez que pase (o asigne) una estructura a un parámetro de protocolo (o variable o campo), los detalles de qué estructura podría haber sido se "pierde" (re: tiempo de compilación) y la tabla de testigos de protocolo entra en juego (re: tiempo de ejecución).

Puede obtener más información sobre el diseño de memoria Swift .


Similar sucede en C #, con el que estoy más familiarizado. Una estructura pasada o asignada a una variable de interfaz o campo / miembro está encuadrada, y la representación en caja de la estructura coincide con la de las representaciones de clase, lo que significa que hay una tabla v para estructuras en caja.

Esperaría que C # y Swift hagan llamadas directas cuando el elemento se conoce en tiempo de compilación como una estructura, y que use vtable dispatch cuando en tiempo de compilación, el elemento solo se conoce como una interfaz.


1
"Yo esperaría C # y Swift para hacer llamadas directas cuando el artículo es conocido en tiempo de compilación como una estructura," sí, este es un proceso que se llama devirtualization
Alexander - Restablecer Mónica

El enlace de arriba ya no funciona. Probablemente quiera hacer referencia a github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst .
Martin R
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.