Files
XCEngine/docs/api/XCEngine/Memory/ProxyAllocator/ProxyAllocator.md

60 lines
2.6 KiB
Markdown
Raw Normal View History

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)