docs: rebuild Memory API content
This commit is contained in:
@@ -1,32 +1,43 @@
|
||||
# PoolAllocator::Allocate
|
||||
|
||||
公开方法,详见头文件声明。
|
||||
从空闲链表中取出一个固定块。
|
||||
|
||||
```cpp
|
||||
void* Allocate(size_t size, size_t alignment = 0) override;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:**
|
||||
- `size` - 参数语义详见头文件声明。
|
||||
- `alignment` - 参数语义详见头文件声明。
|
||||
当前实现按以下顺序执行:
|
||||
|
||||
**返回:** `void*` - 返回值语义详见头文件声明。
|
||||
1. 如果空闲链表为空,返回 `nullptr`。
|
||||
2. 如果 `size > m_blockSize`,返回 `nullptr`。
|
||||
3. 取出链表头节点,把 `m_freeBlocks` 减一。
|
||||
4. 直接返回该节点地址。
|
||||
|
||||
**示例:**
|
||||
需要特别注意:
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
- `alignment` 参数在当前实现中被完全忽略。
|
||||
- 只要 `size <= m_blockSize`,调用就会占用整个 block;不会按请求大小切分。
|
||||
- `size == 0` 也会消耗一个 block。
|
||||
- 返回地址来自构造阶段预先切好的池,不会在调用时再次向系统堆申请内存。
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 根据上下文补齐参数后调用 PoolAllocator::Allocate(...)。
|
||||
(void)object;
|
||||
}
|
||||
```
|
||||
## 参数
|
||||
|
||||
- `size` - 请求大小;必须不大于构造时的 `blockSize`。
|
||||
- `alignment` - 调用期对齐要求;当前实现不使用它。
|
||||
|
||||
## 返回值
|
||||
|
||||
- `void*` - 成功时返回一个 block 的起始地址;池已耗尽或请求过大时返回 `nullptr`。
|
||||
|
||||
## 使用建议
|
||||
|
||||
- 把 `size` 理解为“上界检查”而不是“真实占用字节数”。
|
||||
- 如果调用方依赖逐次调用时的不同对齐要求,当前实现并不满足这种需求。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [Free](Free.md)
|
||||
- [Contains](Contains.md)
|
||||
|
||||
@@ -1,31 +1,45 @@
|
||||
# PoolAllocator::PoolAllocator()
|
||||
# PoolAllocator::Constructor
|
||||
|
||||
构造对象。
|
||||
构造一个固定块池分配器。
|
||||
|
||||
```cpp
|
||||
PoolAllocator(size_t blockSize, size_t poolSize, size_t alignment = 8);
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:**
|
||||
- `blockSize` - 参数语义详见头文件声明。
|
||||
- `poolSize` - 参数语义详见头文件声明。
|
||||
- `alignment` - 参数语义详见头文件声明。
|
||||
构造函数会一次性完成两件事:
|
||||
|
||||
**返回:** `void` - 无返回值。
|
||||
1. 计算每个 block 的实际步长 `actualBlockSize`。
|
||||
2. 申请一整块池内存,并把它串成单向空闲链表。
|
||||
|
||||
**示例:**
|
||||
当 `alignment > 0` 时,当前实现使用下面的位运算向上取整:
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
}
|
||||
(blockSize + alignment - 1) & ~(alignment - 1)
|
||||
```
|
||||
|
||||
随后它会调用 `std::malloc(actualBlockSize * poolSize)`,并在这块连续内存上建立空闲链表。
|
||||
|
||||
## 参数
|
||||
|
||||
- `blockSize` - 逻辑 block 大小,也是 [Allocate](Allocate.md) 允许的最大请求大小。
|
||||
- `poolSize` - block 数量。
|
||||
- `alignment` - block 步长对齐粒度;默认值为 `8`。
|
||||
|
||||
## 返回值
|
||||
|
||||
- 无。
|
||||
|
||||
## 当前实现限制
|
||||
|
||||
- 当前没有验证 `alignment` 是否是 2 的幂。
|
||||
- 当前没有防御 `blockSize == 0`、`poolSize == 0` 或底层分配失败。
|
||||
- 在 `poolSize == 0` 或 `malloc` 失败时,后续空闲链表初始化可能进入未定义行为,因此调用方应保证参数有效。
|
||||
- 对齐只影响 block 步长,不保证 `malloc` 返回的池起始地址本身满足同样的高阶对齐要求。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [Destructor](Destructor.md)
|
||||
- [GetBlockSize](GetBlockSize.md)
|
||||
|
||||
@@ -1,31 +1,36 @@
|
||||
# PoolAllocator::Contains
|
||||
|
||||
公开方法,详见头文件声明。
|
||||
判断指针是否落在当前池的地址范围内。
|
||||
|
||||
```cpp
|
||||
bool Contains(void* ptr) const;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:**
|
||||
- `ptr` - 参数语义详见头文件声明。
|
||||
当前实现只做范围判断:
|
||||
|
||||
**返回:** `bool` - 返回值语义详见头文件声明。
|
||||
1. 如果 `ptr == nullptr` 或 `m_memory == nullptr`,返回 `false`。
|
||||
2. 计算 `ptr` 相对池起始地址的偏移。
|
||||
3. 用构造阶段的实际 block 步长乘以 `m_totalBlocks`,得到整个池的地址范围。
|
||||
4. 只要偏移仍在这个范围内,就返回 `true`。
|
||||
|
||||
**示例:**
|
||||
这意味着:
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
- 它是范围检查,不是“当前已分配块”的检查。
|
||||
- 指向某个 block 中间位置的指针也可能返回 `true`。
|
||||
- 已经释放回池的指针仍可能返回 `true`。
|
||||
- 它不验证指针是否落在 block 边界上。
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 根据上下文补齐参数后调用 PoolAllocator::Contains(...)。
|
||||
(void)object;
|
||||
}
|
||||
```
|
||||
## 参数
|
||||
|
||||
- `ptr` - 待检测指针。
|
||||
|
||||
## 返回值
|
||||
|
||||
- `bool` - 指针位于池地址范围内时返回 `true`;否则返回 `false`。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [Free](Free.md)
|
||||
|
||||
@@ -1,29 +1,31 @@
|
||||
# PoolAllocator::~PoolAllocator()
|
||||
# PoolAllocator::Destructor
|
||||
|
||||
销毁对象并释放相关资源。
|
||||
销毁整个池并释放底层大块内存。
|
||||
|
||||
```cpp
|
||||
~PoolAllocator() override;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:** 无。
|
||||
|
||||
**返回:** `void` - 无返回值。
|
||||
|
||||
**示例:**
|
||||
当前实现只做一件事:
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 对象离开作用域时会自动触发析构。
|
||||
}
|
||||
std::free(m_memory);
|
||||
```
|
||||
|
||||
它不会遍历池中的对象,也不会为池中存放的 C++ 对象调用析构函数。换句话说,`PoolAllocator` 只负责原始内存块,不负责对象生命周期管理。
|
||||
|
||||
## 返回值
|
||||
|
||||
- 无。
|
||||
|
||||
## 使用建议
|
||||
|
||||
- 如果 block 中放的是需要析构的对象,应由调用方先显式析构对象,再销毁分配器。
|
||||
- 分配器销毁后,之前返回的所有 block 指针都会变成悬空指针。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [Free](Free.md)
|
||||
|
||||
@@ -1,31 +1,38 @@
|
||||
# PoolAllocator::Free
|
||||
|
||||
公开方法,详见头文件声明。
|
||||
把一个 block 放回空闲链表。
|
||||
|
||||
```cpp
|
||||
void Free(void* ptr) override;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:**
|
||||
- `ptr` - 参数语义详见头文件声明。
|
||||
当前实现非常直接:
|
||||
|
||||
**返回:** `void` - 无返回值。
|
||||
1. 如果 `ptr == nullptr`,直接返回。
|
||||
2. 把 `ptr` 视为 `FreeNode*`。
|
||||
3. 把该节点插回空闲链表头部。
|
||||
4. 把 `m_freeBlocks` 加一。
|
||||
|
||||
**示例:**
|
||||
## 参数
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
- `ptr` - 要归还的 block 指针。
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 根据上下文补齐参数后调用 PoolAllocator::Free(...)。
|
||||
(void)object;
|
||||
}
|
||||
```
|
||||
## 返回值
|
||||
|
||||
- 无。
|
||||
|
||||
## 当前实现限制
|
||||
|
||||
- 不验证 `ptr` 是否真的来自当前池。
|
||||
- 不验证 `ptr` 是否位于 block 边界。
|
||||
- 不防止重复释放。
|
||||
- 如果把不属于当前池的地址传进来,可能破坏空闲链表甚至直接写坏任意内存。
|
||||
- 如果重复释放同一块,`m_freeBlocks` 可能大于 `m_totalBlocks`,随后统计接口会失真甚至发生无符号下溢。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [Allocate](Allocate.md)
|
||||
- [Contains](Contains.md)
|
||||
|
||||
@@ -1,30 +1,31 @@
|
||||
# PoolAllocator::GetAllocationCount
|
||||
|
||||
获取相关状态或对象。
|
||||
查询当前已分配 block 数量。
|
||||
|
||||
```cpp
|
||||
size_t GetAllocationCount() const override;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:** 无。
|
||||
|
||||
**返回:** `size_t` - 返回值语义详见头文件声明。
|
||||
|
||||
**示例:**
|
||||
当前头文件内联实现返回:
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 根据上下文补齐参数后调用 PoolAllocator::GetAllocationCount(...)。
|
||||
(void)object;
|
||||
}
|
||||
m_totalBlocks - m_freeBlocks
|
||||
```
|
||||
|
||||
这反映的是“当前在用 block 数”,不是累计分配次数。
|
||||
|
||||
## 返回值
|
||||
|
||||
- `size_t` - 当前在用 block 数。
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 这个值依赖 [Free](Free.md) 正确维护 `m_freeBlocks`。
|
||||
- 如果发生重复释放或错误释放,`m_freeBlocks` 可能超过 `m_totalBlocks`,此处会出现无符号下溢并返回失真的大数值。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [GetFreeBlockCount](GetFreeBlockCount.md)
|
||||
|
||||
@@ -1,30 +1,27 @@
|
||||
# PoolAllocator::GetBlockSize
|
||||
|
||||
获取相关状态或对象。
|
||||
查询逻辑 block 大小。
|
||||
|
||||
```cpp
|
||||
size_t GetBlockSize() const;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:** 无。
|
||||
当前头文件内联实现直接返回 `m_blockSize`。
|
||||
|
||||
**返回:** `size_t` - 返回值语义详见头文件声明。
|
||||
这表示的是 API 视角下的单块容量上限,也就是 [Allocate](Allocate.md) 允许的最大请求大小;它不一定等于构造时实际使用的 block 步长。
|
||||
|
||||
**示例:**
|
||||
## 返回值
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
- `size_t` - 逻辑 block 大小。
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 根据上下文补齐参数后调用 PoolAllocator::GetBlockSize(...)。
|
||||
(void)object;
|
||||
}
|
||||
```
|
||||
## 注意事项
|
||||
|
||||
- 如果构造时传入了较大的 `alignment`,实际池内存的 block 间距可能大于这里返回的值。
|
||||
- [GetTotalAllocated](GetTotalAllocated.md)、[GetTotalFreed](GetTotalFreed.md) 和 [GetPeakAllocated](GetPeakAllocated.md) 也都是基于这个逻辑大小计算,而不是基于实际 stride。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [Constructor](Constructor.md)
|
||||
|
||||
@@ -1,30 +1,25 @@
|
||||
# PoolAllocator::GetFreeBlockCount
|
||||
|
||||
获取相关状态或对象。
|
||||
查询当前空闲 block 数。
|
||||
|
||||
```cpp
|
||||
size_t GetFreeBlockCount() const;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:** 无。
|
||||
当前实现直接返回 `m_freeBlocks`。
|
||||
|
||||
**返回:** `size_t` - 返回值语义详见头文件声明。
|
||||
## 返回值
|
||||
|
||||
**示例:**
|
||||
- `size_t` - 当前空闲 block 数。
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
## 注意事项
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 根据上下文补齐参数后调用 PoolAllocator::GetFreeBlockCount(...)。
|
||||
(void)object;
|
||||
}
|
||||
```
|
||||
- 这是一个“当前快照值”,不是历史统计。
|
||||
- 如果调用方错误地传入无效指针或重复释放,`m_freeBlocks` 会被破坏,这里的结果也会随之失真。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [GetAllocationCount](GetAllocationCount.md)
|
||||
|
||||
@@ -1,30 +1,23 @@
|
||||
# PoolAllocator::GetName
|
||||
|
||||
获取相关状态或对象。
|
||||
查询分配器名称。
|
||||
|
||||
```cpp
|
||||
const char* GetName() const override;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:** 无。
|
||||
|
||||
**返回:** `const char*` - 返回值语义详见头文件声明。
|
||||
|
||||
**示例:**
|
||||
当前头文件内联实现固定返回字符串字面量:
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 根据上下文补齐参数后调用 PoolAllocator::GetName(...)。
|
||||
(void)object;
|
||||
}
|
||||
"PoolAllocator"
|
||||
```
|
||||
|
||||
## 返回值
|
||||
|
||||
- `const char*` - 当前固定为 `"PoolAllocator"`。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
|
||||
@@ -1,30 +1,31 @@
|
||||
# PoolAllocator::GetPeakAllocated
|
||||
|
||||
获取相关状态或对象。
|
||||
查询峰值分配量。
|
||||
|
||||
```cpp
|
||||
size_t GetPeakAllocated() const override;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:** 无。
|
||||
|
||||
**返回:** `size_t` - 返回值语义详见头文件声明。
|
||||
|
||||
**示例:**
|
||||
当前头文件内联实现返回:
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 根据上下文补齐参数后调用 PoolAllocator::GetPeakAllocated(...)。
|
||||
(void)object;
|
||||
}
|
||||
m_totalBlocks * m_blockSize
|
||||
```
|
||||
|
||||
这并不是“历史上曾经达到过的最大已用字节数”,而是整个池按逻辑 block 大小计算的总容量上界。
|
||||
|
||||
## 返回值
|
||||
|
||||
- `size_t` - 当前实现下等于总池容量上界。
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 如果你把它当作调试统计里的“历史峰值”,会得到过于乐观的结果。
|
||||
- 这里同样不考虑对齐放大后的真实 stride。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [GetTotalAllocated](GetTotalAllocated.md)
|
||||
|
||||
@@ -1,30 +1,31 @@
|
||||
# PoolAllocator::GetTotalAllocated
|
||||
|
||||
获取相关状态或对象。
|
||||
查询当前已用字节数。
|
||||
|
||||
```cpp
|
||||
size_t GetTotalAllocated() const override;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:** 无。
|
||||
|
||||
**返回:** `size_t` - 返回值语义详见头文件声明。
|
||||
|
||||
**示例:**
|
||||
当前头文件内联实现返回:
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 根据上下文补齐参数后调用 PoolAllocator::GetTotalAllocated(...)。
|
||||
(void)object;
|
||||
}
|
||||
(m_totalBlocks - m_freeBlocks) * m_blockSize
|
||||
```
|
||||
|
||||
因此它表示的是“当前正在使用的逻辑字节数”,而不是累计分配过多少字节。
|
||||
|
||||
## 返回值
|
||||
|
||||
- `size_t` - 当前已用逻辑字节数。
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 这里按 `m_blockSize` 计费,不按对齐后的实际 stride 计费。
|
||||
- 如果 `m_freeBlocks` 因错误释放被破坏,这个值也会失真。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [GetTotalFreed](GetTotalFreed.md)
|
||||
|
||||
@@ -1,30 +1,20 @@
|
||||
# PoolAllocator::GetTotalBlockCount
|
||||
|
||||
获取相关状态或对象。
|
||||
查询池中的总 block 数。
|
||||
|
||||
```cpp
|
||||
size_t GetTotalBlockCount() const;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:** 无。
|
||||
当前头文件内联实现直接返回 `m_totalBlocks`,也就是构造时指定的 block 数量。
|
||||
|
||||
**返回:** `size_t` - 返回值语义详见头文件声明。
|
||||
## 返回值
|
||||
|
||||
**示例:**
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 根据上下文补齐参数后调用 PoolAllocator::GetTotalBlockCount(...)。
|
||||
(void)object;
|
||||
}
|
||||
```
|
||||
- `size_t` - 池的总 block 数。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [GetFreeBlockCount](GetFreeBlockCount.md)
|
||||
|
||||
@@ -1,30 +1,31 @@
|
||||
# PoolAllocator::GetTotalFreed
|
||||
|
||||
获取相关状态或对象。
|
||||
查询当前空闲字节数。
|
||||
|
||||
```cpp
|
||||
size_t GetTotalFreed() const override;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:** 无。
|
||||
|
||||
**返回:** `size_t` - 返回值语义详见头文件声明。
|
||||
|
||||
**示例:**
|
||||
当前头文件内联实现返回:
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 根据上下文补齐参数后调用 PoolAllocator::GetTotalFreed(...)。
|
||||
(void)object;
|
||||
}
|
||||
m_freeBlocks * m_blockSize
|
||||
```
|
||||
|
||||
因此这个接口在 `PoolAllocator` 中表示的是“当前还空着多少逻辑字节”,不是“累计向系统释放了多少字节”。整个池在分配器存活期间始终保留在进程内存中,直到析构时才统一释放。
|
||||
|
||||
## 返回值
|
||||
|
||||
- `size_t` - 当前空闲逻辑字节数。
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 这里同样不考虑对齐放大的真实 stride。
|
||||
- 如果发生错误释放,`m_freeBlocks` 失真,这里的统计也会随之失真。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [GetTotalAllocated](GetTotalAllocated.md)
|
||||
|
||||
@@ -6,38 +6,57 @@
|
||||
|
||||
**头文件**: `XCEngine/Memory/PoolAllocator.h`
|
||||
|
||||
**描述**: 定义 `XCEngine/Memory` 子目录中的 `PoolAllocator` public API。
|
||||
**描述**: 为固定尺寸对象提供 O(1) 弹出/归还的池分配器。
|
||||
|
||||
## 概述
|
||||
|
||||
`PoolAllocator.h` 是 `XCEngine/Memory` 子目录 下的 public header,当前页面作为平行目录中的 canonical 总览,用于汇总该头文件暴露的主要声明。
|
||||
`PoolAllocator` 预先申请一整块内存,然后把它切成固定尺寸的 block,通过空闲链表管理这些 block。它适合:
|
||||
|
||||
## 声明概览
|
||||
- 大量尺寸相同或尺寸上界稳定的小对象
|
||||
- 频繁分配和释放、但不想承担通用堆分配碎片与额外元数据开销的场景
|
||||
|
||||
| 声明 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `PoolAllocator` | `class` | 继承自 `IAllocator` 的公开声明。 |
|
||||
## 生命周期与所有权
|
||||
|
||||
## 公共方法
|
||||
- [Constructor](Constructor.md) 一次性申请整个池。
|
||||
- [Allocate](Allocate.md) 从空闲链表弹出一个 block。
|
||||
- [Free](Free.md) 把 block 放回空闲链表头部。
|
||||
- [Destructor](Destructor.md) 在整个池销毁时一次性释放底层内存。
|
||||
|
||||
| 方法 | 描述 |
|
||||
## 当前实现限制
|
||||
|
||||
- [Reallocate](Reallocate.md) 当前返回 `nullptr`。
|
||||
- `Allocate` 忽略调用时传入的 `alignment` 参数,真正使用的是构造阶段保存的对齐设置。
|
||||
- 对齐逻辑当前只影响 block stride 计算,不保证底层池起始地址本身按该对齐值申请。
|
||||
- 构造函数当前不校验 `blockSize > 0`、`poolSize > 0`,也不处理底层内存申请失败后的初始化路径。
|
||||
- [Free](Free.md) 不检查指针是否真的来自当前池,也不防止重复释放。
|
||||
- [Contains](Contains.md) 当前只检查“是否落在池的地址范围内”,不检查是否对齐到 block 边界,也不检查块是否仍在分配状态。
|
||||
- `GetPeakAllocated` 当前返回整个池的总容量,而不是历史峰值使用量。
|
||||
|
||||
## 线程语义
|
||||
|
||||
- 当前没有锁;需要外部同步。
|
||||
|
||||
## 公开方法
|
||||
|
||||
| 方法 | 说明 |
|
||||
|------|------|
|
||||
| [PoolAllocator()](Constructor.md) | 构造对象。 |
|
||||
| [~PoolAllocator()](Destructor.md) | 销毁对象并释放相关资源。 |
|
||||
| [Allocate](Allocate.md) | 公开方法,详见头文件声明。 |
|
||||
| [Free](Free.md) | 公开方法,详见头文件声明。 |
|
||||
| [Reallocate](Reallocate.md) | 公开方法,详见头文件声明。 |
|
||||
| [Contains](Contains.md) | 公开方法,详见头文件声明。 |
|
||||
| [GetBlockSize](GetBlockSize.md) | 获取相关状态或对象。 |
|
||||
| [GetFreeBlockCount](GetFreeBlockCount.md) | 获取相关状态或对象。 |
|
||||
| [GetTotalBlockCount](GetTotalBlockCount.md) | 获取相关状态或对象。 |
|
||||
| [GetName](GetName.md) | 获取相关状态或对象。 |
|
||||
| [GetTotalAllocated](GetTotalAllocated.md) | 获取相关状态或对象。 |
|
||||
| [GetTotalFreed](GetTotalFreed.md) | 获取相关状态或对象。 |
|
||||
| [GetPeakAllocated](GetPeakAllocated.md) | 获取相关状态或对象。 |
|
||||
| [GetAllocationCount](GetAllocationCount.md) | 获取相关状态或对象。 |
|
||||
| [Constructor](Constructor.md) | 构造固定块池分配器。 |
|
||||
| [Destructor](Destructor.md) | 销毁整个池。 |
|
||||
| [Allocate](Allocate.md) | 分配一个 block。 |
|
||||
| [Free](Free.md) | 归还一个 block。 |
|
||||
| [Reallocate](Reallocate.md) | 重分配 block;当前返回 `nullptr`。 |
|
||||
| [Contains](Contains.md) | 判断指针是否位于池地址范围内。 |
|
||||
| [GetBlockSize](GetBlockSize.md) | 查询逻辑 block 大小。 |
|
||||
| [GetFreeBlockCount](GetFreeBlockCount.md) | 查询空闲 block 数。 |
|
||||
| [GetTotalBlockCount](GetTotalBlockCount.md) | 查询总 block 数。 |
|
||||
| [GetName](GetName.md) | 查询分配器名称。 |
|
||||
| [GetTotalAllocated](GetTotalAllocated.md) | 查询当前已用字节数。 |
|
||||
| [GetTotalFreed](GetTotalFreed.md) | 查询当前空闲字节数。 |
|
||||
| [GetPeakAllocated](GetPeakAllocated.md) | 查询峰值分配量;当前返回总池容量。 |
|
||||
| [GetAllocationCount](GetAllocationCount.md) | 查询当前已分配 block 数。 |
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [当前目录](../Memory.md) - 返回 `Memory` 平行目录
|
||||
- [API 总索引](../../../main.md) - 返回顶层索引
|
||||
- [当前模块](../Memory.md)
|
||||
- [IAllocator](../Allocator/Allocator.md)
|
||||
- [Allocator Selection And Current Limits](../../../_guides/Memory/Allocator-Selection-And-Current-Limits.md)
|
||||
|
||||
@@ -1,32 +1,29 @@
|
||||
# PoolAllocator::Reallocate
|
||||
|
||||
公开方法,详见头文件声明。
|
||||
重分配一个 block。
|
||||
|
||||
```cpp
|
||||
void* Reallocate(void* ptr, size_t newSize) override;
|
||||
```
|
||||
|
||||
该方法声明于 `XCEngine/Memory/PoolAllocator.h`,当前页面用于固定 `PoolAllocator` 类目录下的方法级 canonical 路径。
|
||||
## 行为说明
|
||||
|
||||
**参数:**
|
||||
- `ptr` - 参数语义详见头文件声明。
|
||||
- `newSize` - 参数语义详见头文件声明。
|
||||
当前实现没有真正支持可变尺寸重分配,函数体固定返回 `nullptr`,也不会读取 `ptr` 或 `newSize`。
|
||||
|
||||
**返回:** `void*` - 返回值语义详见头文件声明。
|
||||
## 参数
|
||||
|
||||
**示例:**
|
||||
- `ptr` - 原 block 指针;当前实现忽略。
|
||||
- `newSize` - 新大小;当前实现忽略。
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/PoolAllocator.h>
|
||||
## 返回值
|
||||
|
||||
void Example() {
|
||||
XCEngine::Memory::PoolAllocator object;
|
||||
// 根据上下文补齐参数后调用 PoolAllocator::Reallocate(...)。
|
||||
(void)object;
|
||||
}
|
||||
```
|
||||
- `void*` - 当前固定返回 `nullptr`。
|
||||
|
||||
## 设计说明
|
||||
|
||||
这与池分配器的典型定位一致:它更适合固定尺寸对象,而不是 `realloc` 风格的可变尺寸缓冲。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [返回类总览](PoolAllocator.md)
|
||||
- [返回模块目录](../Memory.md)
|
||||
- [返回类型总览](PoolAllocator.md)
|
||||
- [Allocate](Allocate.md)
|
||||
|
||||
Reference in New Issue
Block a user