ディスパッチは、複数のクラスまたはそれに準じた概念が保持する メソッドを呼び出す際に、どのメソッドを実行するかを選択する仕組みである。
動的ディスパッチは、実行時に動的にメソッドを選択する仕組みである。 Rustの場合、動的ディスパッチは。実際の関数呼び出しを見つけるためにポインタを 追跡する。そのため、静的ディスパッチに比べて、実行時のオーバーヘッドが発生する。
Rustの動的ディスパッチは、DST(Dynamically Sized Types)を使用して実現される。 Rustは基本的に、コンパイル時に型のサイズを決定するが、 DSTを使用することで、実行時にサイズが決定される型を扱うことができる。 これにより、実行時に異なる型のメソッドを呼び出すことが可能になる。 また、ルックアップする際に、vtable(仮想関数テーブル)を使用する。
- Sized TraitおよびDSTについて
Sized Traitは、コンパイル時にサイズが決定される型を表すトレイトである。 Rustでは、参照やほとんどの型には暗黙のうちに実装されている。 このSized Traitが実装されていない型は、DSTと呼ばれていて、 fat pointerを通して扱われる。
静的ディスパッチは、コンパイル時にメソッドを選択する仕組みである。 どの関数を呼び出せばいいかを直接知ることができる。 そのため、実行時のオーバーヘッドは発生しない。
Rustには継承の概念がないため、共通のtraitを実装した別のstructを
定義することで、動的ディスパッチまたは静的ディスパッチが必要となる
状況を実現している。
- Rustのディスパッチについて
https://tourofrust.com/81_ja.html
- Rustのジェネリクスについて
https://qiita.com/Leapcell/items/805a6f7af4d03c8bb6df
- DSTとSized Traitについて