2个发布版本
0.0.2 | 2022年12月9日 |
---|---|
0.0.1 | 2022年12月5日 |
#431 in 内存管理
39KB
872 行
📚 Bookcase - 一个区域分配器
我想学习区域,所以我实现了自己的。然后我发现现有的区域crates并不符合我的口味。
🕐 项目状态
实验性,除非你是🤡,否则不要使用。
📖 术语表
- 人:线程
- 笔记本:区域
- 章节:一组常见对齐页
- 页:固定大小的原始字节缓冲区
- 工具:分配的实现
笔记本开始时是空的。一个人可以写入笔记本。根据他们使用铅笔还是钢笔,他们可能无法擦除笔记。一个人可以将笔记本传递给另一个人。任何一个人都可以在笔记本上写,但一次只能一个人写。任何数量的人可以同时从笔记本中读取。
这个类比并不完美,但比“区域”能提供的要好得多!😁
🎯 目标
- 线程安全
- 安全接口
- 人体工程学
- 快速
- 精简
- 可配置
- 数据结构构建块
- 无外部依赖
- 有文档
🚫 让步
- 不安全的实现细节
- 查找范围外(这不是一个ECS库)
🚀 进展
按粗略优先级顺序
- CI
- CD
- 无依赖
- 有良好的文档
- 线程局部笔记本 (
Personal*Notebook: Send
) - 线程安全笔记本 (
Public*Notebook: Send + Sync
,非常不安全) - 增量分配 (
Pen
) - 释放
- 在稳定rust上编译
- 发布第一个实验版本
- 发布第一个beta版本
- 发布第一个稳定版本
- 异构笔记本 (
*MultiNotebook: Notebook
) - 同构笔记本 (
*MonoNotebook<T>: TypedNotebook<T>
) - 所有分配都是对齐的
-
*MultiNotebook: 分配器
(需要夜间版本) - 可配置页面基本大小(
SizeStrategy
) - 可配置页面增长速率(
GrowthStrategy
) - 不删除独占引用(
alloc*() -> &mut T
) - 自动删除句柄(
new*() -> Handle<T>
) - 笔记本合并
🌳 版本控制
理念
- 向后兼容性正沉睡在海滩上波浪拍打的声音中。
- 假设向后兼容性是在折磨小狗。
结论:SemVer是 🐍🛢
后果
不幸的是,cargo与SemVer绑定。幸运的是,SemVer是版本化的。这意味着我可以创建自己的SemVer版本!😈 呼它为 SemVer Maggie.1.0
。下面是如何工作的
铁的规则
假设所有版本都是破坏性的。
座右铭
努力将破坏性更改减少到绝对最小。
发布频道
每个点分隔的数字代表一个发布频道
稳定
此频道是唯一适合生产使用的频道。
测试版
此频道用于收集准备稳定的好想法。
实验性
此频道是蛮荒之地,所有赌注都取消,小丑行为是常态。
格式: stable.beta.experimental
- 当
experimental > 0
时,版本在实验频道中,否则... - 当
beta > 0
时,版本在测试频道中,否则... - 当
stable > 0
时,版本在稳定频道中,否则... - 版本无效。
因此,所有稳定发布都是对“主要”版本的提升,建议下游开发者在即使不熟悉 SemVer Maggie.1.0
的情况下也应考虑铁的规则。
示例
=1.0.0
- 稳定v1
=1.2.0
- 测试版v2
基于稳定v1
=1.2.3
- 实验v3
基于v2
基于v1
=2.0.1
- 实验v1
基于v2
=0.0.0
- 无效
但是我喜欢 bookcase_alloc = "^1"
!
然后习惯于编译器错误。发布渠道内的版本将仅在其相应的功能启用的情况下编译。默认功能当然是 stable
。启用多个也会编译失败。这是为了防止在生产用户代码中意外使用beta和实验渠道。
... Maggie?
Maggie是我的宠物🐷。一开始很糟糕,但最终你会爱上她。
异常
bookcase_alloc_macros
本身就需要强制执行 SemVer Maggie.1.0
的规则。因此,它将只有一个稳定的发布渠道。
贡献
我创建了一个 discord频道。截至写作时,它只有我一人。阅读目标、让步和进展部分,以获取关于要做什么的想法,并和我讨论我可能接受的更改。你也可以只是问我问题,给我反馈:功能请求,告诉我我的代码很糟糕,或者我太尖锐。所有反馈都受欢迎!