2026-03-26 16:45:24 +08:00
|
|
|
|
# ProxyAllocator
|
|
|
|
|
|
|
|
|
|
|
|
**命名空间**: `XCEngine::Memory`
|
|
|
|
|
|
|
|
|
|
|
|
**类型**: `class`
|
|
|
|
|
|
|
|
|
|
|
|
**头文件**: `XCEngine/Memory/ProxyAllocator.h`
|
|
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
**描述**: 在已有分配器外面包一层统计逻辑的代理分配器。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
`ProxyAllocator` 不直接拥有原始堆,而是把所有内存操作转发给底层分配器,并在外层记录统计信息。这种设计适合:
|
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
|
|
|
|
## 所有权
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
- [Constructor](Constructor.md) 接收一个底层 `IAllocator*` 和一个名称。
|
|
|
|
|
|
- 当前 `ProxyAllocator` 不拥有底层分配器,不会在销毁时释放它。
|
|
|
|
|
|
- 当前实现既不校验底层分配器是否为空,也不复制名称字符串。
|
|
|
|
|
|
- `MemoryManager::CreateProxyAllocator` 当前总是包装系统分配器,而不是任意自定义底层分配器。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
## 当前实现限制
|
|
|
|
|
|
|
|
|
|
|
|
- [Free](Free.md) 会把 `totalFreed` 增加为“当前 allocation count”,而不是被释放块的真实大小,因此释放字节统计当前并不准确。
|
|
|
|
|
|
- [Reallocate](Reallocate.md) 只转发调用,不更新统计信息。
|
|
|
|
|
|
- 如果底层分配器失效或被提前销毁,后续所有代理操作都可能触发未定义行为。
|
|
|
|
|
|
- `GetStats()` 返回内部结构体引用,当前没有为只读访问额外加锁。
|
|
|
|
|
|
- `memoryOverhead` 字段存在,但当前没有被维护。
|
|
|
|
|
|
|
|
|
|
|
|
## 线程语义
|
|
|
|
|
|
|
|
|
|
|
|
- `Allocate`、`Free` 和 `Reallocate` 当前在内部使用 `Threading::Mutex` 保护统计更新。
|
|
|
|
|
|
- `GetStats()` 是无锁只读返回;更适合在无并发修改或调试快照场景下读取。
|
|
|
|
|
|
|
|
|
|
|
|
## 公开方法
|
|
|
|
|
|
|
|
|
|
|
|
| 方法 | 说明 |
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|------|------|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
| [Constructor](Constructor.md) | 构造代理分配器。 |
|
|
|
|
|
|
| [Allocate](Allocate.md) | 通过底层分配器分配,并更新统计。 |
|
|
|
|
|
|
| [Free](Free.md) | 通过底层分配器释放,并更新统计。 |
|
|
|
|
|
|
| [Reallocate](Reallocate.md) | 转发重分配。 |
|
|
|
|
|
|
| [GetTotalAllocated](GetTotalAllocated.md) | 查询累计分配字节。 |
|
|
|
|
|
|
| [GetTotalFreed](GetTotalFreed.md) | 查询累计释放字节。 |
|
|
|
|
|
|
| [GetPeakAllocated](GetPeakAllocated.md) | 查询峰值净分配量。 |
|
|
|
|
|
|
| [GetAllocationCount](GetAllocationCount.md) | 查询当前统计中的分配计数。 |
|
|
|
|
|
|
| [GetStats](GetStats.md) | 读取完整统计结构。 |
|
|
|
|
|
|
| [GetName](GetName.md) | 查询代理名称。 |
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
|
|
|
|
|
## 相关文档
|
|
|
|
|
|
|
2026-03-26 18:02:29 +08:00
|
|
|
|
- [当前模块](../Memory.md)
|
|
|
|
|
|
- [IAllocator](../Allocator/Allocator.md)
|
|
|
|
|
|
- [MemoryManager](../MemoryManager/MemoryManager.md)
|
|
|
|
|
|
- [Allocator Selection And Current Limits](../../../_guides/Memory/Allocator-Selection-And-Current-Limits.md)
|