2 个稳定版本
1.0.1 | 2021 年 2 月 14 日 |
---|
#335 在 嵌入式开发
4,608 每月下载量
用于 25 个软件包(4 个直接使用)
31KB
627 行
aligned-array
这是一个 Jorge Aparicio 的aligned 软件包的分支,并提供了一种将类型约束为在某个边界上对齐的方法。
分支的目的主要是更好地集成generic-array,特别是提供一种通用的“对齐字节”类型,具有安全、无开销的 API,可以将其视为更小数量的字节的序列/较小的对齐,或作为原生字节序的整数。(这类似于某些 Rust SIMD 内置函数可以在不复制的情况下以几种方式“查看”:https://doc.rust-lang.net.cn/nightly/core/arch/x86/struct.__m256i.html)
例如,使用 GenericArray::Split
API,我们可以将已知大小的切片引用拆分为两个引用的片段,其大小在编译时也是已知的。但是,如果我们在一个 Aligned
generic-array
上使用 Split
,我们就失去了有关这两个片段的对齐信息。
对于某些应用程序,这些对齐信息对于以高性能使用这两个片段至关重要,可能以后会使用 SIMD 指令。它还可能使编译器能够仅通过移动它们来生成更快的代码。
此软件包提供了 Split
API 和其他一些实现,这些实现返回 Aligned<GenericArray>
而不是 GenericArray
,而无需在发布模式的二进制文件中创建复制或额外的指令。以这种方式保留对齐信息允许用户以高性能的方式继续解决复杂系统问题,而不会牺牲安全性。
我们还与 subtle 集成,以便对齐字节实现 ConstantTimeEq
。当有对齐信息时,此函数有时可以更快地实现。
与 aligned
软件包的差异具体列表
- 额外的对齐类型:
A32
,A64
。 - 改进了
Aligned
对象的转换:例如,Aligned<A8, T>
实现了AsRef<Aligned<A4, T>>
。这是允许的,因为在大边界对齐的对象必然也在小边界对齐。 - 当可能时,
Aligned
将派生Eq, PartialEq, Hash, Ord, PartialOrd
。 - 当可能时,
Aligned
将派生subtle::ConstantTimeEq
。 - 当可能时,
Aligned
将派生FromIterator
和IntoIterator
。 - 当可能时,
Aligned
将派生generic_array::sequence::GenericSequence
。 Aligned
以保留对齐信息的方式实现了generic_array::sequence::Split
。特别是,Aligned<GenericArray<u8, N>>
可以被分割成Aligned<GenericArray<u8, M>>
和Aligned<GenericArray<u8, N - M>>
,如果M
能够整除对齐值。目前这仅对类型u8
执行,但可以推广。- 额外的特性:
AsNeSlice
和AsAlignedChunks
,以及针对字节对齐数组的实现。这允许对齐的字节序列被解释为本地端序整数的切片,或更小的对齐字节块的切片,而不产生开销。 - 移除了
as-slice
依赖。这个crate在实践中很少有用,因为AsRef<[u8]>
和类似的特性通常可以很好地完成工作。as-slice
不幸地依赖于多个版本的generic-array
,将它们全部纳入构建计划,这很混乱,使得在一些大型项目中更难捕捉和解决依赖不匹配问题。使这个crate可选并不能解决这个问题,因为Cargo会根据功能配置将它们全部添加到Cargo.lock
中。如果维护者发布了只依赖于最新版本generic-array
的as-slice
版本,我们会考虑恢复as-slice
的功能。
不安全代码
这个crate包含比原始的aligned
crate更多的不安全转换。这是实现与generic-array
的集成所必需的。
这些转换与generic-array
内部执行的转换类似:它们通常基于这样的假设,即GenericArray<T, N>
与[T; N]
布局兼容。
所有类似的转换
- 都通过断言强制执行其前提条件,这些断言由 llvm 验证为正确,并在发布模式下构建时删除
- 具有详细的正确性说明
- 在大型项目中进行了广泛测试
此代码还作为 Trail of Bits 正式审计的一部分进行了覆盖
依赖关系
~245KB