11个版本

0.1.0-rc.42023年11月8日
0.1.0-rc.22023年8月22日
0.1.0-rc.02023年6月13日
0.1.0-alpha.72023年5月18日
0.1.0-alpha.12022年8月30日

#252 in 内存管理

47 每月下载量
flatty-io 中使用

MIT/Apache

73KB
2K SLoC

flatty

Crates.io Docs.rs Gitlab CI License

平面消息缓冲区,无需打包/解包即可直接映射到Rust类型。

概述

当类型占用单个连续内存区域时,称为平面类型。当需要以二进制数据的形式存储或发送此类对象,同时又有方便的方式访问其内容而不进行序列化/反序列化时,此类类型非常有用。

此crate提供了基本的平面类型以及创建新用户定义的复合平面类型的方法(使用#[flat]属性宏),这些类型可以像常规Rust structenum一样使用。

此外,此crate可以在不使用std甚至alloc的情况下使用。

概念

转换

可以使用as_bytes(以及不安全的as_mut_bytes)从平面类型的实例中获取二进制表示。也可以将字节转换为平面类型,请参阅就地初始化验证

DST

平面类型可以是动态大小的(如FlatVec),在这种情况下,它利用Rust操作?Sized类型的能力。用户定义的平面结构也可以是无大小的(只允许最后一个字段是无大小的)。甚至平面枚举也可以是无大小的,但Rust尚未原生支持它们,因此只能通过返回包含对原始枚举内容引用的常规枚举的as_ref/as_mut方法来访问其内容。

就地初始化

尺寸类型可以像Rust的普通类型一样实例化。但在DST的情况下,Rust无法以常规方式在栈上构造它,因为其大小在编译时是未知的。相反,我们可以在给定的内存区域初始化这样的类型。

为此,我们可以使用所谓的emplacer——一种可以初始化对象到给定内存的东西。对于尺寸类型,其实例也是emplacer。

emplacer可以应用于原始字节,使用new_in_place或使用assign_in_place替换现有结构的内容。此外,某些类型具有默认的emplacer,可以使用default_in_place初始化为默认状态。

验证

不是任何字节的组合都是扁平类型的有效表示。例如,Bool只有两种有效状态:01,或者FlatVec的长度不能大于其容量。validate可用于检查数据是否针对特定扁平类型有效,或者from_bytes/from_mut_bytes也会执行这种检查。

当您信任您的数据时,则可以使用不安全的from_bytes_unchecked/from_mut_bytes_unchecked省略验证,但这如果数据无效将导致UB。

可移植性

扁平类型保证在具有相同字节序、对齐和地址宽度的平台上具有相同的二进制表示。如果您需要更强的保证,您可以使用Portable类型——它们在任何平台上都具有相同的二进制表示,并且始终对齐到字节。要使自己的扁平类型可移植,请使用#[flat(portable = true)]。此外,这也可以用于创建没有对齐问题的打包扁平类型。

示例

您可以在tests目录中找到一些如何创建和使用扁平类型的示例。

许可

根据您的选择,许可如下:

任选其一。

贡献

除非您明确表示,否则您提交给工作以包含在内的任何贡献,根据Apache-2.0许可证的定义,应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~1.5MB
~39K SLoC