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内存管理

MIT OR Apache-2.0 OR Zlib

120KB
2K SLoC

contiguous_mem

contiguous_mem简化了存储和管理连续内存块中数据的流程。

Crate Documentation CI Status Zlib or MIT or Apache 2.0 license

主要功能

  • 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 功能;旨在用于循环中,因此不支持在保留其他值的同时释放 某些

贡献

欢迎贡献,请随意 创建一个 issuepull request

除非您明确声明,否则项目中的所有贡献都受 Zlib/MIT/Apache 2.0 许可协议的许可。

许可证

本项目的许可证为 ZlibMITApache-2.0 许可协议,您可以选择最适合您的协议。

依赖

~0–250KB