主要观点:作者与全职写 Rust 的同事讨论内存池时,发现彼此方法不同,同事的方法不适合作者通常使用内存池的情况,于是作者决定自己写一个内存池并探索相关问题。
关键信息:
- 内存池是允许低延迟和低抖动对象分配与释放的数据结构,不是通用内存分配器,允许独立的对象生命周期。
- 作者设计的内存池用两个固定大小数组,一个存对象,一个作栈存空闲对象索引,分配时弹出索引返回对象引用,释放时将索引压回栈并重置对象。
- 实现过程中遇到安全问题,通过用
OwnedRef
包装返回的引用解决,确保调用者不能在对象释放后使用它。 - 为支持对象的深度复用,添加
Reset
trait 并在deallocate
中调用,可根据需求实现不同的reset
逻辑。 - 文章还提到对该内存池的一些改进方向,如添加引用有效性检查、实现
Deref
和DerefMut
等。
重要细节: deallocate
函数为unsafe
是因为接受任何引用,可通过添加运行时检查使其安全。OwnedRef
包装的引用访问底层对象有额外开销,但对于通常的情况不是问题。Reset
trait 可用于各种类型,包括标准类型如String
,实现方式根据需求而定。- 对内存池的改进包括添加引用有效性检查、配置池大小、实现不同类型引用转换、自动释放、优化内存访问模式等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。