4个版本 (2个重大更改)

0.2.1 2020年5月13日
0.2.0 2020年5月13日
0.1.0 2019年8月1日
0.0.0 2019年7月11日

#17 in #aligned

Download history 263/week @ 2024-03-13 622/week @ 2024-03-20 486/week @ 2024-03-27 802/week @ 2024-04-03 502/week @ 2024-04-10 321/week @ 2024-04-17 477/week @ 2024-04-24 571/week @ 2024-05-01 424/week @ 2024-05-08 303/week @ 2024-05-15 409/week @ 2024-05-22 435/week @ 2024-05-29 390/week @ 2024-06-05 226/week @ 2024-06-12 254/week @ 2024-06-19 196/week @ 2024-06-26

1,124 monthly downloads
10 个crate中使用 (4 个直接使用)

MIT/Apache

27KB
536

Maligned

内存对齐库

许可证

许可证为以下之一

任选其一。

贡献

除非你明确说明,否则根据Apache-2.0许可证定义的,你有意提交的任何贡献,都应双许可如上所述,不附加任何额外条款或条件。


lib.rs:

获取对齐向量、切片和字节数组或任何其他类型的库

A* 结构体按照指示对齐,并持有单个相同大小的字节数组。这些实现了 Alignment 特性,可用于始终对齐的字节数组,以实现更快的内存复制或硬件复制。数组可以通过 as_bytes()as_bytes_mut() 或通过结构体的解引用作为切片访问。

let alignment_256 = A256::default();

assert_eq!(std::mem::size_of::<A256>(), std::mem::size_of_val(alignment_256.as_bytes()));
assert_eq!(alignment_256.as_bytes().as_ptr() as usize % std::mem::size_of::<A256>(), 0);

如果你需要超过一个 Alignment 的字节数组,你可以创建一个包含它们的向量,并将其转换为始终具有第一个字节对齐的正常字节数组。

let mut v = vec![A512::default(); 100];
assert_eq!(v.as_bytes().len(), std::mem::size_of::<A512>() * 100);
assert_eq!(v.as_bytes().as_ptr() as usize % std::mem::align_of::<A512>(), 0);

v.as_bytes_mut()[512] = 42;
assert_eq!(v[1][0], 42);

还有一个包装器 Aligned,可以将任何类型对齐到指定的对齐方式

// aligned() is an alias for Aligned::new()
let a: Aligned<A32, [u8; 24]> = aligned([0; 24]);
assert_eq!(std::mem::align_of_val(&a), 32);
assert_eq!(&*a as *const u8 as usize % std::mem::align_of::<A32>(), 0);

如果启用了 alloc 功能(默认情况下已启用),则还有更多功能可用。 align_first 返回一个容量至少为 capacity 字节的空Vec。目前需要两个类型参数,尽管第一个可以设置为 _,因为当前impl特性和泛型之间的交互。

let v: Vec<u8> = align_first::<u8, A256>(1009);
assert_eq!(v.as_ptr() as usize % 256, 0);
assert_eq!(v.capacity(), 1009);

align_first_boxedalign_first_boxed_defaultalign_first_boxed_cloned 都返回一个 Box<[T]>,其中第一个元素至少对齐到 Alignment 字节。

// 3 type parameters. The last one should always be _ until impl traits and generics interact better
let boxed: Box<[Option<u128>]> = align_first_boxed::<_, A512, _>(101, |_|Some(42));
let defaulted: Box<[Option<u128>]> = align_first_boxed_default::<_, A128>(101);
let cloned: Box<[Option<u128>]> = align_first_boxed_cloned::<_, Bit512>(101, Some(42));

assert_eq!(&*boxed, &vec![Some(42); 101][..]);
assert_eq!(&boxed, &cloned);
assert_eq!(boxed.len(), 101);
assert_eq!(defaulted.len(), 101);
assert_eq!(cloned.len(), 101);
assert_eq!(&*defaulted, &vec![None; 101][..]);

无运行时依赖

特性