Asayomu Tech
注目★★★★★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は仮想関数テーブルで、実行時に呼び出す実装を選ぶための情報を保持する。

詳細を読む → 元記事へ※ 本文は元記事をご確認ください (asayomu は要約のみ提供)

関連する記事

※ 外部記事の権利は原著作者に帰属します。著作権削除要請は copyright@asayomu.jp までご連絡ください(受領確認 24h・実処理 72h 以内)。