2026-03-26 16:45:24 +08:00
|
|
|
|
# PoolAllocator::Allocate
|
|
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
从空闲链表中取出一个固定块。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
|
void* Allocate(size_t size, size_t alignment = 0) override;
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
## 行为说明
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
当前实现按以下顺序执行:
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
1. 如果空闲链表为空,返回 `nullptr`。
|
|
|
|
|
|
2. 如果 `size > m_blockSize`,返回 `nullptr`。
|
|
|
|
|
|
3. 取出链表头节点,把 `m_freeBlocks` 减一。
|
|
|
|
|
|
4. 直接返回该节点地址。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
需要特别注意:
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
- `alignment` 参数在当前实现中被完全忽略。
|
|
|
|
|
|
- 只要 `size <= m_blockSize`,调用就会占用整个 block;不会按请求大小切分。
|
|
|
|
|
|
- `size == 0` 也会消耗一个 block。
|
|
|
|
|
|
- 返回地址来自构造阶段预先切好的池,不会在调用时再次向系统堆申请内存。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
## 参数
|
|
|
|
|
|
|
|
|
|
|
|
- `size` - 请求大小;必须不大于构造时的 `blockSize`。
|
|
|
|
|
|
- `alignment` - 调用期对齐要求;当前实现不使用它。
|
|
|
|
|
|
|
|
|
|
|
|
## 返回值
|
|
|
|
|
|
|
|
|
|
|
|
- `void*` - 成功时返回一个 block 的起始地址;池已耗尽或请求过大时返回 `nullptr`。
|
|
|
|
|
|
|
|
|
|
|
|
## 使用建议
|
|
|
|
|
|
|
|
|
|
|
|
- 把 `size` 理解为“上界检查”而不是“真实占用字节数”。
|
|
|
|
|
|
- 如果调用方依赖逐次调用时的不同对齐要求,当前实现并不满足这种需求。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
|
|
|
|
|
## 相关文档
|
|
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
- [返回类型总览](PoolAllocator.md)
|
|
|
|
|
|
- [Free](Free.md)
|
|
|
|
|
|
- [Contains](Contains.md)
|