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