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?
language-design
swift-language
uli testigo
fuente
fuente
Respuestas:
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.
fuente