Dynamically Sized Type (DST)

動的Sized型 (DST)

変数、関数パラメーター、static項目、const項目はSizedトレイトでなければならない。

これはRustは、コンパイル時にすべての型のサイズが決定している必要があることを意味する。

(※ Structは暗黙的にSizedトレイトが実装される。)

しかしトレイトオブジェクトやスライスまたDSTをフィールドに持つStructにおいては、ランタイム時にそのサイズを決定する事ができる。

これらを動的Sized型と呼び、ポインタの背後にのみ存在することができる。

このDSTに対するポインタは、ワイドポインタ(wide pointer) になる。

ワイドポインタ

ワイドポインタは通常のポインタに対して2倍のサイズを持つ。

  • DSTに対するポインタ
  • DSTを補間する情報へのポインタ

DSTを補間する情報とは

  • トレイトオブジェクト: vtable
  • スライス: 要素数の長さ情報

動的Sized型 Struct

Structは、有無をいわさずに暗黙的に Sized トレイトになる。 (関数内部のローカル変数は必ずSized実装型でなければならない。)

しかし最後のフィールドのみDST型を宣言することができる。 このときStructは、動的Sized型 になる。

struct MySuperSlice {
    info: u32,
    data: [u8],
}

ジェネリック型の場合は ?Sized 型を持つとき、動的Sized型 を作ることが出来る。

struct MySuperSlice<T: ?Sized> {
    info: u32,
    data: T,
}    

参照

https://doc.rust-lang.org/reference/dynamically-sized-types.html

https://doc.rust-lang.org/nomicon/exotic-sizes.html

関連

トレイトオブジェクト - あるマのメモ書き

Box<T>型 - あるマのメモ書き