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
1,124 monthly downloads
在 10 个crate中使用 (4 个直接使用)
27KB
536 行
Maligned
内存对齐库
许可证
许可证为以下之一
- Apache许可证第2版 (LICENSE-APACHE 或 http://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确说明,否则根据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_boxed、align_first_boxed_default 和 align_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][..]);