#pointers #16-bit #arc #box #respectively #flags #mut

tinypointers

Pointer implementations that take 8 or 16 bits

1 unstable release

0.2.2 Dec 5, 2023
0.2.1 Dec 4, 2023
0.2.0 Dec 3, 2023
0.1.0 Dec 3, 2023

#2673 in Rust patterns

25 downloads per month

MIT license

21KB
474 lines

Tiny Pointers

This crate implements pointer types that take less space than the std equivalents. You can choose between 8 or 16-bit using the flags 1byteid and 2byteid respectively.

TinyBox, TinyArc and TinyPtr are equivalent to Box, Arc and *mut T,respectively.

Some care has been taken to ensure it's a mostly painless transition from rust types to the equivalent tinypointers type. Feel free to open a PR if functionality you need is missing!

How

To accomplish this, memory is allocated on the heap and inserted into a global array. You're given an index inside the array, and this is what is called an id.

Size optimizations

Since this crate strives to minimize memory footprint, NonZero* are used internally to enable memory layout optimizations. This means both structs have the same size in the following example:

use tinypointers::TinyBox;

struct Bar(TinyBox<i32>);

struct Foo(Option<TinyBox<i32>>);

// 2 == 2
assert_eq!(std::mem::size_of::<Bar>(), std::mem::size_of::<Foo>())

Dependencies

~0.4–5MB
~11K SLoC