1个不稳定版本
0.2.1 | 2024年5月16日 |
---|---|
0.2.0 |
|
#1128 in Rust模式
12KB
125 行
[!注意]
这是一个针对syn 2而非syn 1的原始type-layout的修补版本。当原始作者应用补丁时,此crate将被撤回。有关此问题的进度,请参阅 PR。该补丁包含以下更改
- 将依赖项syn v2用于替代syn v1.0.40。
- 使用memoffset v0.9替代v0.5,以修复memoffset中已知的一个错误,该错误可能导致读取未初始化的内存。
- 将Rust MSRV更新到1.60(继承自syn 2)。
- 将TypeLayoutInfo中的Field结构更改为枚举,从发布源到crates.io上的v0.2.0进行功能同步。
使用此补丁的方式如下
type-layout = { version = "0.2", package = "type-layout-syn2" }
。虽然这些更改在技术上具有破坏性,但原始作者将决定实际版本。
type-layout
type-layout是一个类型布局调试辅助工具,提供可#[derive]
的特质,它报告
- 类型的名称、大小和最小对齐
- 每个字段的名称、类型、偏移和大小
- 由于对齐要求而产生的填充
type-layout目前仅在具有命名字段的struct上起作用。 这是一个临时限制。
示例
类型布局仅在它们定义了#[repr(C)]
时才被定义。此crate支持非#[repr(C)]
类型,但它们的布局是不可预测的。
use type_layout::TypeLayout;
#[derive(TypeLayout)]
#[repr(C)]
struct Foo {
a: u8,
b: u32,
}
println!("{}", Foo::type_layout());
// prints:
// Foo (size 8, alignment 4)
// | Offset | Name | Size |
// | ------ | --------- | ---- |
// | 0 | a | 1 |
// | 1 | [padding] | 3 |
// | 4 | b | 4 |
对齐类型有尾随填充,这可能在某些FFI场景中成为bug的来源。
use type_layout::TypeLayout;
#[derive(TypeLayout)]
#[repr(C, align(128))]
struct OverAligned {
value: u8,
}
println!("{}", OverAligned::type_layout());
// prints:
// OverAligned (size 128, alignment 128)
// | Offset | Name | Size |
// | ------ | --------- | ---- |
// | 0 | value | 1 |
// | 1 | [padding] | 127 |
最小支持的Rust版本(MSRV)
type-layout支持Rust 1.34.1及更高版本。直到type-layout达到1.0,MSRV的更改将需要主要版本号的增加。在1.0之后,MSRV的更改将仅需要小版本号的增加,但需要充分的理由。
许可证
许可协议为以下之一
- Apache License,版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确声明,否则根据Apache-2.0许可证定义,你提交的任何旨在包含在作品中的贡献都将按照上述方式双重许可,不附加任何额外的条款或条件。
依赖关系
~0.3–0.8MB
~19K SLoC