1 个不稳定版本
0.1.0 | 2024年6月15日 |
---|
在 算法 中排名 #726
11KB
167 行
local-or-heap
此crate提供了一种具有预定义大小类型的实现,无论包含的 T
类型的大小如何,必要时使用堆分配。
此crate的目的是允许泛型参数的大小决定其存储位置。这在您想要打包结构体布局时很有用,例如优化内存访问,但结构体包含一个您不知道大小的泛型类型参数。
如果 size_of::<T>() <= size_of::<SizeT>()
,性能应尽可能接近使用原始类型。如果 size_of::<T>() > size_of::<SizeT>()
,性能应尽可能接近使用box的情况。
此crate的功能与smallbox类似,但它以无法处理动态大小类型为代价,具有较低的运行时开销(内存和指令)。
基本用法
use local_or_heap::LocalOrHeap;
let int_obj = LocalOrHeap::<usize>::new(42);
assert_eq!(LocalOrHeap::<usize>::is_heap(), false);
assert_eq!(&*int_obj, &42);
let buf_obj = LocalOrHeap::<[usize; 8]>::new([0, 1, 2, 3, 4, 5, 6, 7]);
assert_eq!(LocalOrHeap::<[usize; 8]>::is_heap(), true);
assert_eq!(buf_obj.as_ref(), &[0, 1, 2, 3, 4, 5, 6, 7]);
自定义大小
use local_or_heap::LocalOrHeap;
type LoH = LocalOrHeap::<[usize; 8], [u8; 1024]>;
let buf_obj = LoH::new([0, 1, 2, 3, 4, 5, 6, 7]);
assert_eq!(LoH::is_heap(), false);
assert_eq!(&*buf_obj, &[0, 1, 2, 3, 4, 5, 6, 7]);
assert_eq!(core::mem::size_of::<LoH>(), 1024);