8个不稳定版本 (3个破坏性更新)
0.4.2 | 2023年9月20日 |
---|---|
0.4.1 | 2023年9月19日 |
0.3.1 | 2023年8月31日 |
0.2.0 | 2023年8月29日 |
0.1.2 | 2023年8月28日 |
#137 在 内存管理 中
120KB
2K SLoC
contiguous_mem
contiguous_mem简化了存储和管理连续内存块中数据的流程。
主要功能
no_std
支持!- 简单直观的接口,类似于标准容器。
- 支持动态调整分配的内存大小,保持创建的引用有效(适用于安全实现)。
专门实现
您可以选择最适合您用例的实现,这样可以避免同步的运行时成本,以及如果您不需要它,还可以避免安全封装引用数据的内存成本。
默认实现保持存储数据的相对偏移量,在访问时解析。
用例
入门
将crate添加到您的依赖项
[dependencies]
contiguous_mem = { version = "0.4" }
可选:启用 no_std
功能以在 no_std
环境中使用
[dependencies]
contiguous_mem = { version = "0.4", features = ["no_std"] }
功能
no_std
- 启用原子操作、互斥锁和读写锁的no_std
依赖项debug
- 在与错误处理无关的结构上启用derive(Debug)
ptr_metadata
<nightly> - 允许将引用转换为dyn Trait
error_in_core
<nightly> - 在no_std
环境中启用对core::error::Error
的支持
用法
use contiguous_mem::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Data {
value: u32,
}
fn main() {
// Create a ContiguousMemory instance with a capacity of 1024 bytes and 1-byte alignment
let mut memory = ContiguousMemory::new(1024);
// Store data in the memory container
let data = Data { value: 42 };
let stored_number: ContiguousMemoryRef<u64> = memory.push(22u64);
let stored_data: ContiguousMemoryRef<Data> = memory.push(data);
// Retrieve and use the stored data
assert_eq!(*stored_data.get(), data);
assert_eq!(*stored_number.get(), 22);
}
- 引用具有与
RefCell
相似的API。
请注意,store 返回的引用类型是推断出来的,这里仅为了演示目的而展示。
更多使用示例请参见 examples
目录。
稳定性
所有在 1.0.0 之前版本的库尚未经过生产环境验证。这是我第一个 crate,还有很多边缘情况我没有机会去考虑。
已进行初步测试,但我认为它们不足以保证完全的正确性。不过,我确实在使用这个 crate 开发另一个 crate,这样我可以在示例之外进行一些集成测试。
替代方案
- 手动管理内存以确保数据的连续放置
- 容易出错,并且需要使用不安全代码
- 对于存储具有统一
Layout
的类型,当您只需要在容器级别擦除它们的类型时,请参见 - 使用自定义分配器如 blink-alloc 来确保数据的连续放置
- 需要
allocator_api
功能 blink-alloc
提供了与这个 crate 相似的功能,但没有allocator_api
功能;旨在用于循环中,因此不支持在保留其他值的同时释放 某些 值
- 需要
贡献
欢迎贡献,请随意 创建一个 issue 或 pull request。
除非您明确声明,否则项目中的所有贡献都受 Zlib/MIT/Apache 2.0 许可协议的许可。
许可证
本项目的许可证为 Zlib、MIT 或 Apache-2.0 许可协议,您可以选择最适合您的协议。
依赖
~0–250KB