#stack #box #dst #alloc #no-std

nightly no-std nanobox

NanoBox 优化:将小项存储在栈上,大项回退到堆上

1 个不稳定版本

新版本 0.1.0 2024 年 8 月 24 日

1031数据结构

Download history 89/week @ 2024-08-18

89 每月下载量

MIT/Apache

26KB
484 代码行

nanobox

crates.io

NanoBox 优化:将小项存储在栈上,大项回退到堆上。

文档

用法

首先,将以下内容添加到您的 Cargo.toml

[dependencies]
nanobox = "0.1"

无尺寸类型

有两种方法可以拥有无尺寸的 NanoBox:使用 nanobox!() 宏(如果您懒惰,则使用 nb!())或将尺寸的 NanoBox 实例强制转换(需要夜间编译器)。

一旦启用功能 coerce,尺寸的 NanoBox<T> 将自动转换为所需的 NanoBox<T: ?Sized>

示例

通过 NanoBox 消除小项的堆分配

use nanobox::NanoBox;

let small: NanoBox<_> = NanoBox::new([0; 2]);
let large: NanoBox<_> = NanoBox::new([0; 32]);

assert_eq!(small.len(), 2);
assert_eq!(large.len(), 32);

assert_eq!(*small, [0; 2]);
assert_eq!(*large, [0; 32]);

assert!(small.is_heap() == false);
assert!(large.is_heap() == true);

无尺寸类型

使用 nanobox!() 宏进行构建

use nanobox::NanoBox;
use nanobox::nb;

let array: NanoBox<[usize]> = nb!([0usize, 1]);

assert_eq!(array.len(), 2);
assert_eq!(*array, [0, 1]);

强制转换

use nanobox::NanoBox;
 
let array: NanoBox<[usize]> = NanoBox::new([0usize, 1]);

assert_eq!(array.len(), 2);
assert_eq!(*array, [0, 1]);

Any 降级

use std::any::Any;
use nanobox::NanoBox;
use nanobox::nb;

let num: NanoBox<dyn Any> = nb!(1234u32);

if let Some(num) = num.downcast_ref::<u32>() {
    assert_eq!(*num, 1234);
} else {
    unreachable!();
}

容量

NanoBox 默认具有 3*usize 的容量。您可以通过指定容量类型参数来更改容量。

nanobox_small_item_small_space
                        time:   [494.41 ps 497.13 ps 500.13 ps]
nanobox_small_item_large_space
                        time:   [5.4159 ns 5.4886 ns 5.5663 ns]
box_small_item          
                        time:   [8.8157 ns 8.8830 ns 8.9659 ns]

497.13 ps 与 8.8830 ns 的小空间中小项。5.5 ns 与 8.9 ns 的大空间中小项。对于小空间中的小项和大空间中的大项,NanoBoxBox 更快。

nanobox_large_item_small_space
                        time:   [23.428 ns 23.478 ns 23.523 ns]

nanobox_large_item_large_space
                        time:   [18.288 ns 18.461 ns 18.605 ns]

box_large_item          time:   [16.378 ns 16.438 ns 16.497 ns]

对于大项,NanoBox 在所有情况下都比 Box 慢。您不希望遇到栈溢出,因此应为大项使用 Box

许可证

根据以下任一项许可

由您选择。

感谢

感谢 @andylokandy 编写 smallbox

无运行时依赖