Warum braucht Swift Zeugen-Tabellen?

10

Ich versuche, mich über die Implementierungsdetails von Swift zu informieren, und eine Sache, die ich nicht genau festlegen kann, sind die "Zeugen-Tabellen". Es sieht so aus, als wären sie ein separater vtable-Zeiger, der für Strukturen verwendet wird.

Aber warum brauchst du das? Strukturen werden nach Wert kopiert, sodass Sie bereits beim Kompilieren wissen, um welchen Typ es sich handelt. Würden Sie nicht einfach fest codieren, welche Methode Sie aufrufen und damit fertig werden sollen? Warum sollten Sie mit diesen Methoden einen virtuellen Versand durchführen?

uliwitness
quelle
1
Können Sie auf einige Ressourcen in diesen Strukturzeugen-Tabellen verweisen? Ich konnte nur Protokollzeugen-Tabellen finden.
Jörg W Mittag

Antworten:

12

Strukturen können Schnittstellen implementieren, die in Swift als Protokolle bezeichnet werden. Sie können einen Parameter, eine Variable oder ein Feld / Mitglied haben, das / das ein Protokoll ist, und da mehrere verschiedene Strukturen, ganz zu schweigen von Klassen, dasselbe Protokoll implementieren können, sobald Sie eine Struktur einem Protokollparameter übergeben (oder zuweisen) (oder Variable oder Feld), deren Einzelheiten möglicherweise verloren gegangen sind (Re: Compile Time) und die Protokollzeugen-Tabelle ins Spiel kommt (Re: Runtime).

Sie können mehr über das Swift-Speicherlayout erfahren .


Ähnliches passiert in C #, mit dem ich besser vertraut bin. Eine Struktur, die einer Schnittstellenvariablen oder einem Feld / Element übergeben oder zugewiesen wird, wird eingerahmt, und die umrahmte Darstellung der Struktur stimmt mit der der Klassendarstellungen überein, was bedeutet, dass es eine vtable für umrahmte Strukturen gibt.

Ich würde erwarten, dass sowohl C # als auch Swift direkte Aufrufe ausführen, wenn das Element zur Kompilierungszeit als Struktur bekannt ist, und vtable dispatch verwenden, wenn das Element zur Kompilierungszeit nur als Schnittstelle bekannt ist.

Erik Eidt
quelle
1
"Ich würde erwarten, dass sowohl C # als auch Swift direkte Aufrufe tätigen, wenn das Element zur Kompilierungszeit als Struktur bekannt ist." Ja, dies ist ein Prozess namens Devirtualisierung
Alexander - Reinstate Monica
Der obige Link funktioniert nicht mehr. Sie möchten wahrscheinlich auf github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst verweisen .
Martin R