0.0.1 |
|
---|
#21 in #aligned
56KB
695 行
align
– 强类型内存对齐保证
一些字节只需要对齐。想要以 $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
生成的依赖项图
或作为 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