Pointer Types in Rust
Table of Contents
- Used for explicitly allocating values on the heap.
- Provides exclusive ownership.
- Use
Box when you want to opt-in to storing something on the heap, which otherwise wouldn't go there. - Generally, use
Box when: - Writing a recursive type.
- Optimizing the code (e.g., a large
struct that is expensive to move around). - Want to use
dyn SomeTrait and have ownership of it.
- Both
Arc and Rc are reference counting types that provide shared ownership. - Anything shared with
Arc or Rc is immutable. Arc is more expensive, but is thread-safe.Rc is less expensive, but is not thread-safe.
- All three
Cell, RefCell, and Mutex provide shared ownership. - Anything shared with
Cell, RefCell, or Mutex is mutable. Cell and RefCell are not thread-safe.Mutex is thread-safe.- Use
Cell if the type is Copy, RefCell otherwise.
Cow is a clone-on-write smart pointer.- Usually used with strings.
- Generally, use
Cow for optional ownership (i.e., operations that may or may not modify input). Cow is also a smart pointer.
- Both
*const T and *mut T represent a generic raw pointer. - Dereferencing
*const T yields an immutable place expression, *mut T yields a mutable one. - A place expression is an expression that represents a memory location.
- In terms of variance,
*const T is covariant, while *mut T is invariant.