#tagged-pointers #pointers #tags #no-alloc

no-std packed_ptr

Rust 中的可配置且泛型的标记指针实现

3 个版本

0.1.2 2024年2月24日
0.1.1 2023年12月2日
0.1.0 2023年12月2日

548数据结构

每月 50 次下载

MIT 许可证

52KB
869

打包指针

Rust 中的可配置且泛型 标记指针 实现。

标记指针是一种将值和标记(一些数据)存储在单个指针中的技术。此实现允许您使用 LSB 和 MSB 作为标记,并通过泛型参数进行配置。

用法

便携式用法

use packed_ptr::PackedPtr;
use packed_ptr::config::AlignOnly;

let data = 0xdeadbeefu32;
let ptr = PackedPtr::new(&data, 1, AlignOnly).unwrap();
assert_eq!(data, unsafe { *ptr.ptr() });
assert_eq!(1, ptr.data());

平台特定用法

x86_64 上,使用第 4 级分页,最高 16 位是未使用的。因此,我们可以将 18 位数据打包到一个 *const u32

use packed_ptr::PackedPtr;
use packed_ptr::config::Level4Paging;

let data = 0xdeadbeefu32;
let ptr = PackedPtr::new(&data, (1 << 18) - 1, Level4Paging).unwrap();
assert_eq!(data, unsafe { *ptr.ptr() });
assert_eq!((1 << 18) - 1, ptr.data());

类型安全数据

packed_ptr 为存储和检索指针中的数据提供了一个类型安全接口。数据必须实现 Packable,并且可以使用 TypedPackedPtr 将其打包到指针中。

use packed_ptr::TypedPackedPtr;
use packed_ptr::config::AlignOnly;

let data = 0xdeadbeefu32;
let packed = (true, false);
let ptr = TypedPackedPtr::new(&data, packed, AlignOnly).unwrap();
assert_eq!(data, unsafe { *ptr.ptr() });
assert_eq!(packed, ptr.data());

参考

packed_ptr 还为存储和检索从引用中打包的数据提供了一个类型安全接口。

use packed_ptr::PackedRef;
use packed_ptr::config::AlignOnly;

let data = 0xdeadbeefu32;
let packed = (true, false);

let ref1 = PackedRef::new(&data, packed, AlignOnly).unwrap();
assert_eq!(data, *ref1);
assert_eq!(packed, ref1.data());

依赖关系

~58KB