web-dev-qa-db-ja.com

なぜSwiftは目撃テーブルが必要なのですか?

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

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

10
uliwitness

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

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


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

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

12
Erik Eidt