30个版本 (8个破坏性)

0.8.0-alpha.17 2024年8月21日
0.8.0-alpha.162024年7月2日
0.8.0-alpha.152024年6月26日
0.8.0-alpha.72024年3月6日
0.1.0 2018年11月29日

#22 in 编码

Download history 1315176/week @ 2024-05-01 1343685/week @ 2024-05-08 1399787/week @ 2024-05-15 1372289/week @ 2024-05-22 1566565/week @ 2024-05-29 1550008/week @ 2024-06-05 1696976/week @ 2024-06-12 1519041/week @ 2024-06-19 1564122/week @ 2024-06-26 1585246/week @ 2024-07-03 1681636/week @ 2024-07-10 1631163/week @ 2024-07-17 1766941/week @ 2024-07-24 2183217/week @ 2024-07-31 2197470/week @ 2024-08-07 1657857/week @ 2024-08-14

8,109,459 每月下载量
用于 23,783 个crate (213 直接)

BSD-2-Clause OR Apache-2.0 OR MIT

775KB
9K SLoC

zerocopy

需要更多关于zerocopy的功能?提交一个 客户请求问题

快速,安全,编译错误。选择两个。

Zerocopy使零成本的内存操作变得轻松。我们编写unsafe,所以你不需要。

概述

转换特质

Zerocopy提供了四个可推导的特质,用于零成本转换

  • TryFromBytes表示类型可以从某些字节序列安全转换(基于运行时检查)
  • FromZeros表示零字节序列表示类型的有效实例
  • FromBytes表示类型可以从任意字节序列安全转换
  • IntoBytes表示类型可以安全转换为字节序列

这些特质支持有大小类型、切片和切片DSTs

标记特质

Zerocopy提供了三个可推导的标记特质,它们本身不提供任何功能,但需要调用转换特质提供的方法

  • KnownLayout表示zerocopy可以推理类型的一定布局属性
  • Immutable表示类型不受内部可变性影响,除非通过所有权或独占(&mut)借用
  • Unaligned表示类型的对齐要求为1

通常应在可能的情况下推导这些标记特质。

转换宏

Zerocopy提供了四个宏,用于在类型之间进行安全、零成本的转换

  • (try_[try_transmute])transmute(条件性)将一个类型的值转换为相同大小的另一个类型的值
  • transmute_mut将一个类型的可变引用转换为相同大小的另一个类型的可变引用
  • transmute_ref将一个类型的可变或不可变引用转换为相同大小的另一个类型的不可变引用

这些宏在编译时执行对齐和大小检查,但不能在泛型上下文中使用。对于泛型转换,请使用由转换特质定义的方法。

字节序感知数值

Zerocopy提供了字节序感知的整数类型,这些类型支持这些转换;请参阅byteorder模块。这些类型对于网络解析特别有用。

Cargo功能

  • alloc 默认情况下,zerocopyno_std。当启用alloc功能时,将alloc crate作为依赖项添加,并添加了一些与分配相关的功能。

  • std 默认情况下,zerocopyno_std。当启用std功能时,将std crate作为依赖项添加(即禁用no_std),并添加了对一些std类型的支持。std意味着alloc

  • derive 通过zerocopy-derive crate提供核心标记特质的推导。这些推导从zerocopy重新导出,因此不需要直接依赖zerocopy-derive

    但是,如果您在Cargo.toml中直接依赖zerocopyzerocopy-derive,可能会获得更好的编译时间,因为这样做将允许Rust并行编译这些crate。为此,不要启用derive功能,并在Cargo.toml中将这两个依赖项列出,具有相同的非零版本号;例如

    [dependencies]
    zerocopy = "0.X"
    zerocopy-derive = "0.X"
    
  • simd 当启用simd功能时,为所有在目标平台上存在的稳定SIMD类型发出FromZerosFromBytesIntoBytes实现。请注意,SIMD类型的布局尚未稳定,因此如果布局更改使这些实现无效,则可能在未来删除这些实现。有关更多信息,请参阅打包SIMD向量的布局的Rust不安全代码指南参考页面。

  • simd-nightly 启用simd功能并添加了对仅在nightly上可用的SIMD类型的支持。由于这些类型是不稳定的,因此将来可能会在任何时候删除对任何类型的支持。

安全理念

Zerocopy专门设计用于在安全关键环境中使用。我们努力确保Zerocopy代码在Rust当前内存模型下以及任何未来的内存模型下都是可靠的。我们通过以下方式确保这一点:

  • ...不是“猜测”Rust的语义。我们用精确的理由注释unsafe代码,以引用Rust官方文档的相关部分。当Rust的文档语义不清楚时,我们与Rust操作语义团队合作,以阐明Rust的文档。
  • ...严格测试我们的实现。 我们使用 Miri 进行测试,确保zerocopy在广泛的受支持的目标平台上具有良好的性能,包括不同的端序和指针宽度,以及Rust的当前和实验性内存模型。
  • ...形式化证明我们实现的正确性。 我们应用形式验证工具如 Kani 来证明zerocopy的正确性。

更多信息,请参阅我们的完整 正确性策略

与Project Safe Transmute的关系

Project Safe Transmute 是Rust项目的一个官方计划,旨在开发语言级支持以实现更安全的转换。该项目与zerocopy等crate进行咨询,以确定哪些方面可以从编译器支持中受益,并开发了一种 实验性的、编译器支持的静态分析,用于判断对于给定的类型,任何该类型的值是否可以安全地转换为其他类型。一旦这个功能足够成熟,zerocopy计划用编译器支持的版本替换其内部的可转换性分析(由我们的自定义 derive 实现)。这个变化可能是一个对zerocopy用户不可见的实现细节。

Project Safe Transmute不会取代zerocopy的大部分高级抽象。实验性的编译器分析是检查 unsafe 代码正确性的工具,而不是避免编写 unsafe 代码的工具。在可预见的未来,像zerocopy这样的crate仍将被需要,以便在Project Safe Transmute提供的构建块之上提供高级抽象。

MSRV

请参阅我们的 MSRV 策略

变更日志

Zerocopy使用 GitHub 发布

免责声明

免责声明:Zerocopy不是官方支持的Google产品。

依赖