3 个版本
0.1.2 | 2024年2月24日 |
---|---|
0.1.1 | 2023年12月2日 |
0.1.0 | 2023年12月2日 |
548 在 数据结构 中
每月 50 次下载
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