Files
XCEngine/docs/api/XCEngine/Memory/PoolAllocator/Allocate.md

44 lines
1.3 KiB
Markdown
Raw Normal View History

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)