#rfc #nightly #experimental #fat-pointer

nightly no-std rfc2580

对RFC 2580的(增强)实现

4个版本 (2个破坏性更新)

0.3.0 2021年2月13日
0.2.0 2021年1月25日
0.1.1 2021年1月24日
0.1.0 2021年1月24日

#246无标准库

MIT/Apache

13KB
122

RFC 2580提案的(扩展)实现。

目的。

本crate的目的有两个。

  1. 能够拆分fat指针,并在以后重新组装。
  2. 能够对任何指针执行此操作,无论是trait指针、切片还是常规的Sized类型。

第二个能力,据我所知,RFC 2580并未提及,但它是使无论类型T的性质如何,都能统一处理*const T的关键。

这种统一处理大大简化了自定义存储(如thin示例中展示的ThinBox)的实现。特别是,统一处理允许ThinBox的实现不使用专门化,这是一个没有稳定日期的不稳定特性。

用法。

本crate定义的特质(PointeeMetaData)已经对所有类型实现,通常不需要单独使用,除了作为界限。

相反,本crate的高级API是两个函数:

  • into_raw_parts,它将指针拆分为元数据和指向数据的指针部分。
  • from_raw_parts,它将两部分合并以重新创建(可能是fat)指针。

安全性。

本crate完全以指针为操作对象;它执行的运算即使在存在悬垂指针或null指针的情况下也是安全的。

作为回报,它重新创建的指针是否安全解引用完全取决于用于重新创建完整指针的数据指针是否安全解引用。

示例。

一个简单的示例,展示如何拆分指针并重新创建它。

use rfc2580::{from_raw_parts, into_raw_parts};

let array = [1; 4];
let slice = &array[..];
let (meta, data) = into_raw_parts(slice as *const [i32]);
let reconstituted = from_raw_parts(meta, data);
assert_eq!(slice as *const [i32], reconstituted);

无运行时依赖