#alignment #byte #aligned #simd #align

对齐器

数据对齐保证的实用程序

10 个版本

0.0.10 2022 年 10 月 8 日
0.0.9 2022 年 7 月 25 日
0.0.7 2022 年 6 月 3 日
0.0.6 2022 年 5 月 28 日

内存管理 中排名第 165

每月下载 22
bbolt-rs 中使用

MIT 许可证

62KB
870

aligners – 强类型内存对齐保证

Rust Miri docs.rs

Crates.io GitHub Release Date GitHub last commit

Crates.io

一些字节只需要对齐。想要将字节批量处理为 8 字节并解释为 u64?它们必须是 8 字节对齐的。想在字节上运行 SIMD 操作?您需要使用特殊的非对齐指令并冒着性能风险,或者按照目标要求对齐它们。也许您的高性能算法需要页面对齐?

验证某物是否对齐很难。 aligners 通过引入强类型对齐类型来解决此问题。要在目标架构上将对齐的字节对齐到页面边界,您只需做

use aligners::{alignment, AlignedBytes};

let bytes: [u8; 8] = [ 1, 2, 3, 4, 5, 6, 7, 8 ];
let aligned: AlignedBytes<alignment::Page> = bytes.into();

就这样。 AlignedBytes<A> 拥有字节。通过获取引用,您得到 &AlignedSlice<A>,它与 &[u8] 基本相同,只是其对齐由类型保证。

状态

该包正在积极开发中,API 不稳定。它包含能够将字节对齐到页面或 SIMD 块边界的 MVP 和迭代对齐块的功能。

该包在多个架构上持续构建和测试。我们还使用 Miri 在多个目标三元组上进行测试,以测试难以发现的错误。

不安全

由于该领域的低级指针操作性质,此包需要使用 unsafe 代码。需要使用 unsafe 的两个地方是

  • 创建 AlignedBytes,因为它需要显式与分配器交互以获取正确对齐的字节;
  • AlignedSlice 和常规字节数组之间进行转换,这依赖于前者的 repr(transparent) 可以被转换为后者。
  • 在内部使用 AlignedBlock 以维护类型的不可变特性。

欢迎通过 cargo-crev 进行审查。

依赖项

cargo-deps 生成的依赖关系图

 dependencies graph

或作为 cargo tree 的输出

aligners v0.0.1
├── cfg-if v1.0.0
├── lazy_static v1.4.0
└── page_size v0.4.2
    └── libc v0.2.125

理由

  • cfg-if – 以更易读的方式配置条件编译,特别是确定 SIMD 块大小。它轻量级且不包含不安全代码。
  • lazy_static – 用于懒加载验证和缓存页面大小。
  • page_size – 用于获取 alignment::Page 的页面大小。

开发者

  • cargo-hack – 用于通过编译和运行特征幂集的代码来进行更健壮的测试。
  • anyhow – 在 simd_alignment_test 中使用,以便于错误处理。

crev

建议始终使用 cargo-crev 来验证每个依赖项的可靠性,包括此依赖项。审查受到欢迎。

要将我添加到您的WoT信任列表,请信任我的crev-proof仓库

cargo crev trust id https://github.com/V0ldek/crev-proofs

依赖项

~230KB