1 个不稳定版本
新版本 0.1.0 | 2024 年 8 月 24 日 |
---|
1031 在 数据结构
89 每月下载量
26KB
484 代码行
nanobox
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 的大空间中小项。对于小空间中的小项和大空间中的大项,NanoBox
比 Box
更快。
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
。
许可证
根据以下任一项许可
- Apache 许可证 2.0 版(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- 麻省理工学院许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
感谢
感谢 @andylokandy 编写 smallbox