8000
Skip to content

Myxogastria0808/dispatch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ディスパッチ

ディスパッチは、複数のクラスまたはそれに準じた概念が保持する メソッドを呼び出す際に、どのメソッドを実行するかを選択する仕組みである。

動的ディスパッチ

動的ディスパッチは、実行時に動的にメソッドを選択する仕組みである。 Rustの場合、動的ディスパッチは。実際の関数呼び出しを見つけるためにポインタを 追跡する。そのため、静的ディスパッチに比べて、実行時のオーバーヘッドが発生する。

動的ディスパッチの仕組み

Rustの動的ディスパッチは、DST(Dynamically Sized Types)を使用して実現される。 Rustは基本的に、コンパイル時に型のサイズを決定するが、 DSTを使用することで、実行時にサイズが決定される型を扱うことができる。 これにより、実行時に異なる型のメソッドを呼び出すことが可能になる。 また、ルックアップする際に、vtable(仮想関数テーブル)を使用する。

  • Sized TraitおよびDSTについて

Sized Traitは、コンパイル時にサイズが決定される型を表すトレイトである。 Rustでは、参照やほとんどの型には暗黙のうちに実装されている。 このSized Traitが実装されていない型は、DSTと呼ばれていて、 fat pointerを通して扱われる。

静的ディスパッチ

静的ディスパッチは、コンパイル時にメソッドを選択する仕組みである。 どの関数を呼び出せばいいかを直接知ることができる。 そのため、実行時のオーバーヘッドは発生しない。

サンプルコード

Rustには継承の概念がないため、共通のtraitを実装した別のstructを 定義することで、動的ディスパッチまたは静的ディスパッチが必要となる 状況を実現している。

References

  • Rustのディスパッチについて

https://tourofrust.com/81_ja.html

  • Rustのジェネリクスについて

https://qiita.com/Leapcell/items/805a6f7af4d03c8bb6df

  • DSTとSized Traitについて

https://zenn.dev/woden/articles/36b367559161b9

https://zenn.dev/senk/articles/0e57e6da138e77

About

Rustの動的ディスパッチと静的ディスパッチをまとめたレポジトリ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
0