mirror of
https://github.com/bspeice/speice.io
synced 2025-07-01 22:06:26 -04:00
Allocations in Rust series
This commit is contained in:
39
blog/2019-02-09-summary/index.mdx
Normal file
39
blog/2019-02-09-summary/index.mdx
Normal file
@ -0,0 +1,39 @@
|
||||
---
|
||||
slug: 2019/02/summary
|
||||
title: "Allocations in Rust: Summary"
|
||||
date: 2019-02-09 12:00:00
|
||||
authors: [bspeice]
|
||||
tags: []
|
||||
---
|
||||
|
||||
While there's a lot of interesting detail captured in this series, it's often helpful to have a
|
||||
document that answers some "yes/no" questions. You may not care about what an `Iterator` looks like
|
||||
in assembly, you just need to know whether it allocates an object on the heap or not. And while Rust
|
||||
will prioritize the fastest behavior it can, here are the rules for each memory type:
|
||||
|
||||
<!-- truncate -->
|
||||
|
||||
**Global Allocation**:
|
||||
|
||||
- `const` is a fixed value; the compiler is allowed to copy it wherever useful.
|
||||
- `static` is a fixed reference; the compiler will guarantee it is unique.
|
||||
|
||||
**Stack Allocation**:
|
||||
|
||||
- Everything not using a smart pointer will be allocated on the stack.
|
||||
- Structs, enums, iterators, arrays, and closures are all stack allocated.
|
||||
- Cell types (`RefCell`) behave like smart pointers, but are stack-allocated.
|
||||
- Inlining (`#[inline]`) will not affect allocation behavior for better or worse.
|
||||
- Types that are marked `Copy` are guaranteed to have their contents stack-allocated.
|
||||
|
||||
|
||||
**Heap Allocation**:
|
||||
|
||||
- Smart pointers (`Box`, `Rc`, `Mutex`, etc.) allocate their contents in heap memory.
|
||||
- Collections (`HashMap`, `Vec`, `String`, etc.) allocate their contents in heap memory.
|
||||
- Some smart pointers in the standard library have counterparts in other crates that don't need heap
|
||||
memory. If possible, use those.
|
||||
|
||||

|
||||
|
||||
-- [Raph Levien](https://docs.google.com/presentation/d/1q-c7UAyrUlM-eZyTo1pd8SZ0qwA_wYxmPZVOQkoDmH4/edit?usp=sharing)
|
Reference in New Issue
Block a user