#layout #type-layout #type #const #field-name #variant-name #report

nightly const-type-layout

可推导的 const 特性,用于查看和比较结构体、联合体或枚举的布局

5 个不稳定版本

0.3.1 2024 年 5 月 18 日
0.3.0 2024 年 3 月 21 日
0.2.1 2023 年 12 月 24 日
0.2.0 2023 年 12 月 10 日
0.1.0 2023 年 1 月 20 日

483Rust 模式 中排名

Download history 3/week @ 2024-05-10 338/week @ 2024-05-17 75/week @ 2024-05-24 88/week @ 2024-05-31 25/week @ 2024-06-07 6/week @ 2024-07-19 61/week @ 2024-07-26 3/week @ 2024-08-02

每月下载量 70

MIT/Apache 许可协议

98KB
2K SLoC

CI Status MSRV Latest Version Rust Doc Crate Rust Doc Main License Status Code Coverage Gitpod Ready-to-Code

const-type-layout 是一个类型布局比较工具,提供可推导的 #[derive] TypeLayout 特性,报告

  • 类型的名称、大小和最小对齐方式
  • 类型的结构,即结构体、联合体或枚举
  • 每个字段的名称和偏移量
  • 每个变体的名称和区分符

通过自动实现的 TypeGraphLayout 特性,还将深层类型布局以图的形式报告。

此软件包在 Lucien Greathouse 的原始运行时 type-layout 软件包的基础上进行了大量开发。

示例

类型的布局只有在它们被定义为 #[repr(C)] 时才定义。此软件包适用于非 #[repr(C)] 类型,但它们的布局是不可预测的。

use const_type_layout::TypeLayout;

#[derive(TypeLayout)]
#[repr(C)]
struct Foo {
    a: u8,
    b: u32,
}

assert_eq!(
    format!("{:#?}", Foo::TYPE_LAYOUT),
r#"TypeLayoutInfo {
    name: "mycrate::mymodule::Foo",
    size: 8,
    alignment: 4,
    structure: Struct {
        repr: "C",
        fields: [
            Field {
                name: "a",
                offset: Inhabited(
                    0,
                ),
                ty: "u8",
            },
            Field {
                name: "b",
                offset: Inhabited(
                    4,
                ),
                ty: "u32",
            },
        ],
    },
}"#
);

对齐方式过宽的类型具有尾部填充,这可能在某些 FFI 场景中成为错误的来源

use const_type_layout::TypeLayout;

#[derive(TypeLayout)]
#[repr(C, align(128))]
struct OverAligned {
    value: u8,
}

assert_eq!(
    format!("{:#?}", OverAligned::TYPE_LAYOUT),
r#"TypeLayoutInfo {
    name: "mycrate::mymodule::OverAligned",
    size: 128,
    alignment: 128,
    structure: Struct {
        repr: "C,align(128)",
        fields: [
            Field {
                name: "value",
                offset: Inhabited(
                    0,
                ),
                ty: "u8",
            },
        ],
    },
}"#
)

许可协议

以下任一许可协议下许可:

由您选择。

贡献

除非您明确表示否则,根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献都应作为上述双重许可,不附加任何额外条款或条件。

依赖项

~175KB