Mengapa Swift membutuhkan meja saksi?

10

Saya mencoba untuk membaca detail implementasi Swift, dan satu hal yang tidak bisa saya pecahkan adalah "tabel saksi" nya. Sepertinya itu adalah pointer vtable terpisah yang digunakan untuk struct.

Tetapi mengapa Anda membutuhkannya? Struct disalin oleh nilai, jadi Anda sudah tahu pada waktu kompilasi jenis apa mereka. Jadi bukankah Anda hanya hard-code metode mana untuk memanggil dan dilakukan dengan itu? Mengapa melakukan pengiriman virtual pada metode ini?

uliwitness
sumber
1
Bisakah Anda menunjukkan beberapa sumber pada tabel saksi struct itu? Yang saya dapat temukan hanyalah tabel saksi protokol.
Jörg W Mittag

Jawaban:

12

Structs dapat mengimplementasikan antarmuka, yang disebut protokol di Swift. Anda dapat memiliki parameter, variabel, atau bidang / anggota yang merupakan protokol, dan, karena beberapa struct yang berbeda, belum lagi kelas, dapat mengimplementasikan protokol yang sama, setelah Anda lulus (atau menetapkan) struct ke parameter protokol (atau variabel atau bidang), spesifik yang mungkin menjadi "hilang" (re: waktu kompilasi) dan tabel saksi protokol ikut bermain (re: runtime).

Anda dapat mempelajari lebih lanjut tentang tata letak memori Swift .


Hal serupa terjadi pada C #, yang lebih saya kenal. Sebuah struct yang diteruskan atau ditugaskan ke variabel antarmuka atau bidang / anggota dikotak, dan representasi kemas dari struct cocok dengan representasi kelas, yang berarti ada vtable untuk struct kotak.

Saya mengharapkan C # dan Swift untuk melakukan panggilan langsung ketika item diketahui pada waktu kompilasi sebagai struct, dan untuk menggunakan pengiriman vtable ketika pada waktu kompilasi, item tersebut hanya dikenal sebagai antarmuka.

Erik Eidt
sumber
1
"Saya harapkan C # dan Swift untuk melakukan panggilan langsung ketika item tersebut diketahui pada waktu kompilasi sebagai struct," ya, ini adalah proses yang disebut devirtualization
Alexander - Reinstate Monica
Tautan di atas tidak berfungsi lagi. Anda mungkin ingin merujuk github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst .
Martin R