Swiftにウィットネステーブルが必要なのはなぜですか?


10

Swiftの実装の詳細を読み込もうとしていますが、特定できないのは、その「ウィットネステーブル」です。構造体に使用される別個のvtableポインターのようです。

しかし、なぜそれが必要なのでしょうか。構造体は値によってコピーされるため、コンパイル時にそれらの型がわかっています。では、どのメソッドを呼び出してそれを実行するかをハードコーディングするだけではないでしょうか?これらのメソッドで仮想ディスパッチを実行する理由


1
それらのstruct witnessテーブルのいくつかのリソースを指すことができますか?私が見つけることができたのは、プロトコル監視テーブルだけです。
イェルクWミッターク

回答:


12

構造体は、Swiftではプロトコルと呼ばれるインターフェースを実装できます。プロトコルであるパラメーター、変数、またはフィールド/メンバーを持つことができます。また、クラスは言うまでもなく、複数の異なる構造体がプロトコルパラメーターに構造体を渡す(または割り当てる)と、同じプロトコルを実装できるため(または変数またはフィールド)、それがあったかもしれない構造体の詳細は「失われ」(再:コンパイル時)、プロトコル監視テーブルが機能します(再:ランタイム)。

Swiftのメモリレイアウトについて詳しく知ることができます


私がよく知っているC#でも同様です。インターフェース変数またはフィールド/メンバーに渡されるか割り当てられる構造体はボックス化され、構造体のボックス化表現はクラス表現のそれと一致します。つまり、ボックス化構造体のvtableがあります。

C#とSwiftの両方が、項目がコンパイル時に構造体として認識されている場合に直接呼び出しを行い、コンパイル時にvtableディスパッチを使用する場合、項目がインターフェースとしてのみ認識されることを期待します。


1
「C#とSwiftの両方が、コンパイル時に項目が構造体として認識さ
Alexander-

上記のリンクはもう機能しません。おそらくgithub.com/apple/swift/blob/master/docs/ABI/TypeLayout.rstを参照する必要があります。
マーティンR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.