smallbox
Small Box
optimization: store small item on the stack and fallback to heap for large item.
# Usage
First, add the following to your Cargo.toml
:
toml
[dependencies]
smallbox = "0.5"
Next, add this to your crate root:
rust
extern crate smallbox;
If you want this crate to work with dynamic-sized type, you can request it via:
toml
[dependencies]
smallbox = { version = "0.5", features = ["unsize"] }
Currently smallbox
by default links to the standard library, but if you would
instead like to use this crate in a #![no_std]
situation or crate, and want to
opt out heap dependency and SmallBox<T>
type, you can request this via:
toml
[dependencies.smallbox]
version = "0.5"
features = ["unsize"]
default-features = false
Enable heap
feature for #![no_std]
build to link to alloc
crate
and bring SmallBox<T>
back.
toml
[dependencies.smallbox]
version = "0.5"
features = ["unsize", "heap"]
default-features = false
# Feature Flags
This crate has the following cargo feature flags:
std
heap
SmallBox<T>
std
feature flag is opted out, this will link
alloc
crate, and it need nightly rust for that.unsize
DST
(dynamic-sized type).The only possible way to use this crate on stable rust is to use the default feature flag, which means you can't use it in no_std
environment or use it with DST
(dynamic-sized type).
Once the feature unsize
is enabled, the item type T
of SmallBox
and StackBox
can
and must be an unsized type, such as trait object or owned array slice.
This crate delivers two core type:
SmallBox<T, Space>
: Stores T
on heap or stack depending on the size of T
. It takes StackBox<T, Space>
as an varience to store small item, and then fallback to heap allocated Box<T>
when type T
is larger then the capacity of Space
.
StackBox<T, Space>
: Represents as a fixed-capacity allocation, and stores item on stack.
Eliminate heap alloction for small items by SmallBox
:
```rust use smallbox::SmallBox; use smallbox::space::S4;
let small: SmallBox<_, S4> = SmallBox::new([0; 2]); let large: SmallBox<_, S4> = SmallBox::new([0; 32]);
asserteq!(small.len(), 2); asserteq!(large.len(), 32);
match small { SmallBox::Stack(val) => assert_eq!(*val, [0; 2]), _ => unreachable!() }
match large { SmallBox::Box(val) => assert_eq!(*val, [0; 32]), _ => unreachable!() } ```
The following examples requires unsize
feature flag enabled.
Trait object dynamic-dispatch:
```rust use smallbox::StackBox; use smallbox::space::S1;
let val: StackBox
assert!(*val == 5)
```
Any
downcasting:
```rust use std::any::Any; use smallbox::SmallBox; use smallbox::space::S2;
let num: SmallBox
if let Some(num) = num.downcastref::
The test platform is Windows 10 on Intel E3 v1230 v3.
``` running 6 tests test boxlargeitem ... bench: 102 ns/iter (+/- 15) test boxsmallitem ... bench: 48 ns/iter (+/- 16) test smallboxlargeitemlargespace ... bench: 64 ns/iter (+/- 1) test smallboxlargeitemsmallspace ... bench: 113 ns/iter (+/- 14) test smallboxsmallitemlargespace ... bench: 17 ns/iter (+/- 0) test smallboxsmallitemsmallspace ... bench: 6 ns/iter (+/- 0)
test result: ok. 0 passed; 0 failed; 0 ignored; 6 measured; 0 filtered out ```
to_box()
for SmallBox<T>
of unsize
version.All kinds of contribution are welcome.
Licensed under either of
at your option.