11次发布
0.1.0-rc.6 | 2023年9月20日 |
---|---|
0.1.0-rc.5 | 2023年9月19日 |
0.1.0-rc.2 | 2023年8月22日 |
0.1.0-rc.0 | 2023年6月13日 |
0.1.0-alpha.1 | 2023年1月11日 |
399 in 内存管理
46 每月下载量
38KB
808 行
flatty
直接映射到Rust类型的扁平消息缓冲区,无需打包/解包。
概述
当类型占用单个连续内存区域时,称为扁平类型。当需要以二进制数据形式存储或发送此类对象,同时又有方便的方式访问其内容而不进行序列化/反序列化时,此类类型非常有用。
此crate提供基本的扁平类型以及创建新的用户定义复合扁平类型的方式(使用#[flat]
属性宏),几乎可以像常规Rust struct
或enum
一样使用。
此外,此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
只有两种有效状态:0
和1
,或者FlatVec
的长度不得大于其容量。validate
可以用来检查数据是否适用于特定的扁平类型,或者from_bytes/
from_mut_bytes
也执行此类检查。
当您信任您的数据时,则可以省略验证,使用不安全的from_bytes_unchecked/from_mut_bytes_unchecked
,但这会导致如果数据无效则产生未定义行为(UB)。
可移植性
扁平类型保证它在具有相同字节序、对齐和地址宽度的平台上具有相同的二进制表示。如果您需要更强大的保证,您可以使用Portable
类型——它们在任何平台上都有相同的二进制表示,并且始终对齐到字节。要创建自己的扁平类型以使其可移植,请使用#[flat(portable = true)]
。此外,这也可以用来创建无对齐问题的打包扁平类型。
示例
您可以在tests
目录中找到有关如何创建和使用扁平类型的示例:tests
。
许可证
根据您的要求,许可如下
- 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许可证定义的,您有意提交以包含在作品中的任何贡献,都应按上述方式双许可,不附加任何额外的条款或条件。
依赖关系
~1.3–1.8MB
~42K SLoC