speice.io/_posts/2019-02-09-summary.md

34 lines
1.6 KiB
Markdown
Raw Normal View History

2019-02-09 23:21:25 -05:00
---
layout: post
title: "Summary: What Are the Rules?"
description: "A synopsis and reference."
category:
tags: [rust, understanding-allocations]
---
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
2019-02-10 22:44:40 -05:00
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:
2019-02-09 23:21:25 -05:00
**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.
**Stack Allocation**:
2019-02-10 22:44:40 -05:00
- Everything not using a smart pointer will be allocated on the stack.
2019-02-09 23:21:25 -05:00
- 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.
**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.
2019-02-10 12:18:36 -05:00
![Container Sizes in Rust](/assets/images/2019-02-04-container-size.svg)
2019-02-10 22:44:40 -05:00
-- [Raph Levien](https://docs.google.com/presentation/d/1q-c7UAyrUlM-eZyTo1pd8SZ0qwA_wYxmPZVOQkoDmH4/edit?usp=sharing)