Rust 中的不同内存池

主要观点:作者与全职写 Rust 的同事讨论内存池时,发现彼此方法不同,同事的方法不适合作者通常使用内存池的情况,于是作者决定自己写一个内存池并探索相关问题。
关键信息

  • 内存池是允许低延迟和低抖动对象分配与释放的数据结构,不是通用内存分配器,允许独立的对象生命周期。
  • 作者设计的内存池用两个固定大小数组,一个存对象,一个作栈存空闲对象索引,分配时弹出索引返回对象引用,释放时将索引压回栈并重置对象。
  • 实现过程中遇到安全问题,通过用OwnedRef包装返回的引用解决,确保调用者不能在对象释放后使用它。
  • 为支持对象的深度复用,添加Reset trait 并在deallocate中调用,可根据需求实现不同的reset逻辑。
  • 文章还提到对该内存池的一些改进方向,如添加引用有效性检查、实现DerefDerefMut等。
    重要细节
  • deallocate函数为unsafe是因为接受任何引用,可通过添加运行时检查使其安全。
  • OwnedRef包装的引用访问底层对象有额外开销,但对于通常的情况不是问题。
  • Reset trait 可用于各种类型,包括标准类型如String,实现方式根据需求而定。
  • 对内存池的改进包括添加引用有效性检查、配置池大小、实现不同类型引用转换、自动释放、优化内存访问模式等。
阅读 39
0 条评论