Dynamically Sized Types
Most types have a fixed size that is known at compile time and implement the trait Sized
. A type with a size that is known only at run-time is called a dynamically sized type (DST) or, informally, an unsized type. Slices and trait objects are two examples of DSTs. Such types can only be used in certain cases:
-
Pointer types to DSTs are sized but have twice the size of pointers to sized types
- Pointers to slices also store the number of elements of the slice.
- Pointers to trait objects also store a pointer to a vtable.
-
DSTs can be provided as type arguments to generic type parameters having the special
?Sized
bound. They can also be used for associated type definitions when the corresponding associated type declaration has a?Sized
bound. By default, any type parameter or associated type has aSized
bound, unless it is relaxed using?Sized
. - Traits may be implemented for DSTs. Unlike with generic type parameters,
Self: ?Sized
is the default in trait definitions. - Structs may contain a DST as the last field; this makes the struct itself a DST.
Note: variables, function parameters, const items, and static items must be
Sized
.
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.
https://doc.rust-lang.org/reference/dynamically-sized-types.html