核心是编译期静态推导+运行时线性计步实现零开销生命周期管理:通过所有权转移、raii封装、作用域绑定、(version,seq)状态机校验及静态可达性检查,消除原子引用计数。

核心思路是把引用计数从“运行时动态维护”转为“编译期静态推导 + 运行时无原子操作的线性计步”,从而实现零开销的安全生命周期管理。
用所有权转移替代共享引用
避免在对象池中引入多引用场景,从根本上消除计数增减。每个池对象在分配时绑定唯一持有者(如某个任务上下文、协程或作用域块),归还池时直接移交所有权,不经过中间引用传递。
- 分配时不增加引用计数,而是标记为“已出池、独占”
- 传递给下游函数时采用 move 语义(如仓颉中的
let n2 = n1),原变量立即失效,不触发计数加减 - 池回收接口只接受“已失效”的句柄,校验其内部状态位而非引用值
生命周期与作用域强绑定
将对象生命周期严格对齐到词法作用域边界,由编译器自动插入“入池/出池”事件点,无需运行时计数器字段。
- 使用 RAII 风格结构体封装池对象,构造即出池,析构即归还
- 作用域嵌套深度即为“使用层数”,可用栈帧偏移或编译期常量标识当前层级
- 禁止跨作用域保存裸指针或句柄;若需延迟归还,必须显式调用
pool::hold()并进入独立生命周期段
用版本号+序列号替代计数器
放弃整型计数器,改用不可逆的单调递增标识组合,使“是否被使用”变为可判定的状态机问题。
- 每个池槽位携带一个
version: u32和一个seq: u16,分配时seq++,归还时version++ - 使用者持有一个
(slot_id, seq)元组,访问前校验pool[slot_id].seq == seq,失败即说明已被复用 - 该机制无读写冲突、无需原子指令、不依赖内存屏障,仅一次 load + 比较
静态可达性约束检查
在编译阶段借助借用检查器或自定义 lint 工具,禁止写出可能造成悬挂引用或隐式共享的代码模式。
- 禁止对池对象取地址(
&T)、禁止存入Vec<t></t>或HashMap等通用容器 - 要求所有池对象使用必须带明确作用域标签(如
#[pool_scope("net_io")]),链接期验证跨域调用 - 生成调试信息时附带每块内存的“活跃路径树”,供运行时轻量断言(如检测是否在中断上下文中误归还)










