#alignment #byte #aligned #align #simd

已删除 align-rs

数据对齐保证的实用工具

0.0.1 2022年5月17日

#21 in #aligned

MIT 许可证

56KB
695

align – 强类型内存对齐保证

Rust

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

验证某物是否对齐是很困难的。align 通过引入强类型对齐类型来解决此问题。为了使字节在目标架构上的页面边界对齐,你所需要做的只是

use align::{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] 相同,只是它的对齐由类型保证。

状态

请注意,此软件包正在积极开发中。它包含在 x86_64 上讨论页面对齐和 SIMD 块对齐的最小可行产品。

不安全

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

  • 创建 AlignedBytes,因为它需要显式地与分配器合作以获取正确对齐的字节;
  • AlignedSlice 和常规字节切片之间转换,它依赖于前者的 repr(transparent) 可以被 mem::transmute 转换为后者。
  • 在内部对 AlignedBlock 进行操作以维护类型的规范。

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

依赖项

cargo-deps 生成的依赖项图

 dependencies graph

或作为 cargo tree 的输出

align v0.1.0
├── 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 的页面大小。

Dev

  • cargo-hack – 用于通过编译和运行功能幂集代码来进行更健壮的测试。

crev

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

要将我添加到您的WoT信任我的crev-proof存储库

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

依赖项

~230KB