dyn
is a prefix of a trait object's type.
The dyn
keyword is used to highlight that calls to methods on the associated Trait
are dynamically dispatched. To use the trait this way, it must be 'object safe'.
Unlike generic parameters or impl Trait
, the compiler does not know the concrete type that is being passed. That is, the type has been erased. As such, a dyn Trait
reference contains two pointers. One pointer goes to the data (e.g., an instance of a struct). Another pointer goes to a map of method call names to function pointers (known as a virtual method table or vtable).
At run-time, when a method needs to be called on the dyn Trait
, the vtable is consulted to get the function pointer and then that function pointer is called.
The above indirection is the additional runtime cost of calling a function on a dyn Trait
. Methods called by dynamic dispatch generally cannot be inlined by the compiler.
However, dyn Trait
is likely to produce smaller code than impl Trait
/ generic parameters as the method won't be duplicated for each concrete type.
Read more about object safety
and trait objects.
© 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/std/keyword.dyn.html