#const-generics #alignment #const #align #layout

无 std elain

使用 const generics 设置类型的最小对齐方式

3 个版本 (破坏性更新)

0.3.0 2021 年 4 月 13 日
0.2.0 2021 年 4 月 8 日
0.1.0 2021 年 4 月 8 日

#651Rust 模式

Download history 1535/week @ 2024-03-13 1499/week @ 2024-03-20 924/week @ 2024-03-27 2047/week @ 2024-04-03 1494/week @ 2024-04-10 2856/week @ 2024-04-17 1971/week @ 2024-04-24 4439/week @ 2024-05-01 4030/week @ 2024-05-08 2689/week @ 2024-05-15 684/week @ 2024-05-22 2105/week @ 2024-05-29 1857/week @ 2024-06-05 1339/week @ 2024-06-12 1581/week @ 2024-06-19 2822/week @ 2024-06-26

7,839 每月下载量
15 个crate中使用 (直接使用 7 个)

MIT/Apache

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);

无运行时依赖