#layout #heap-allocation #explicit #fixed-size #struct #smallbox

no-std local-or-heap

提供了一种具有预定义大小类型的实现,无论包含的T类型的大小如何,必要时使用堆分配。

1 个不稳定版本

0.1.0 2024年6月15日

算法 中排名 #726

MIT/Apache

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);

无运行时依赖