注目★★★★★Hacker News
Rustのdyn Trait、vtableがメモリで担う役割
30秒で把握
- 1Rustのdyn Traitはdataとvtableの16バイトwide pointerで動的ディスパッチ
- 2Vec<Box<dyn Draw>>でCircleとSquareを同じコレクションに格納
- 3静的ディスパッチは実行時コストなし、dyn Traitは型混在に対応
要約
Rustのdyn Traitは、データへのポインタとvtableへのポインタを組み合わせた16バイトのwide pointerで動的ディスパッチを実現する。静的ディスパッチでは型ごとに関数を生成するため実行時コストはないが、異なる型を同じVecに格納できない。Vec<Box<dyn Draw>>なら、各要素をdataポインタとvtableポインタの組として保持でき、CircleとSquareを混在させられる。Rustではvtableをオブジェクト内に埋め込まず、&dyn TraitやBox<dyn Trait>を使った呼び出し時に組み合わせる。Selfを返すメソッドやジェネリック引数を持つメソッドは、必要なvtable項目を確定できないためdyn Traitにできない。記事はZSTのサイズが0になる仕組みや、型とTraitの組ごとにvtableが分かれる様子もメモリ上で検証する。
あなたへの影響
RustでTrait objectや異種型コレクションを扱うエンジニアは、&dyn TraitとBox<dyn Trait>のメモリ表現を確認し、静的・動的ディスパッチを次の実装検証で使い分けるとよい。
推奨:vtableは仮想関数テーブルで、実行時に呼び出す実装を選ぶための情報を保持する。