3 个版本 (破坏性更新)
0.3.0 | 2021 年 4 月 13 日 |
---|---|
0.2.0 | 2021 年 4 月 8 日 |
0.1.0 | 2021 年 4 月 8 日 |
#651 在 Rust 模式
7,839 每月下载量
在 15 个crate中使用 (直接使用 7 个)
15KB
166 代码行
Elain
使用 const generics 设置类型的最小对齐方式,而不是使用 #[repr(align(N))]
。
基本用法
类型 Align<N>
是一个零大小类型,对齐方式等于 N
use elain::Align;
use core::mem::{align_of, align_of_val};
assert_eq!(align_of::<Align<1>>(), 1);
assert_eq!(align_of::<Align<2>>(), 2);
assert_eq!(align_of::<Align<4>>(), 4);
const FOO_ALIGN: usize = 8;
#[repr(C)]
struct Foo {
_align: Align<FOO_ALIGN>,
}
let foo: Foo = Foo { _align: Align::NEW };
assert_eq!(align_of_val(&foo), 8);
有效的对齐方式是小于或等于 228 的 2 的幂。向 Align
提供无效的对齐方式会导致类型错误
use elain::Align;
struct Foo(Align<3>); // Compile Error
泛型用法
因为只有 一些 整数是有效的对齐方式,因此泛型地提供类型的对齐方式需要一些额外的工作
use elain::Align;
struct Foo<const N: usize> {
_align: Align<N>,
}
为了解决这个问题,可以添加一个类似于这样的 where
约束,使用 Alignment
trait 来检查 Align<N>
是否有效。
use elain::{Align, Alignment};
use core::mem::align_of;
struct Foo<const MIN_ALIGNMENT: usize>
where
Align<MIN_ALIGNMENT>: Alignment
{
_align: Align<MIN_ALIGNMENT>,
bar: u8,
baz: u16,
}
assert_eq!(align_of::<Foo<1>>(), 2);
assert_eq!(align_of::<Foo<2>>(), 2);
assert_eq!(align_of::<Foo<4>>(), 4);