83 lines
2.4 KiB
Markdown
83 lines
2.4 KiB
Markdown
|
|
# LinearAllocator
|
|||
|
|
|
|||
|
|
**命名空间**: `XCEngine::Memory`
|
|||
|
|
|
|||
|
|
**类型**: `class`
|
|||
|
|
|
|||
|
|
**描述**: 线性分配器,提供顺序分配和一次性释放的内存管理,适用于帧分配和临时对象。
|
|||
|
|
|
|||
|
|
## 概述
|
|||
|
|
|
|||
|
|
`LinearAllocator` 以顺序方式分配内存,每次分配都紧接在上一次分配之后。它不支持单个内存块的释放,只能通过 `Clear()` 一次性清空所有内存。这使得它非常适合作为帧分配器,每帧开始时 Clear 即可。
|
|||
|
|
|
|||
|
|
## 公共方法
|
|||
|
|
|
|||
|
|
### 构造/析构
|
|||
|
|
|
|||
|
|
| 方法 | 描述 |
|
|||
|
|
|------|------|
|
|||
|
|
| `explicit LinearAllocator(size_t size, IAllocator* parent = nullptr)` | 构造函数,预分配指定大小的缓冲区 |
|
|||
|
|
| `~LinearAllocator()` | 析构函数,释放所有内存 |
|
|||
|
|
|
|||
|
|
### IAllocator 实现
|
|||
|
|
|
|||
|
|
| 方法 | 描述 |
|
|||
|
|
|------|------|
|
|||
|
|
| `void* Allocate(size_t size, size_t alignment = 8) override` | 顺序分配内存 |
|
|||
|
|
| `void Free(void* ptr) override` | 空操作(不支持单个释放) |
|
|||
|
|
| `void* Reallocate(void* ptr, size_t newSize) override` | 重新分配(总是分配新内存) |
|
|||
|
|
|
|||
|
|
### 线性操作
|
|||
|
|
|
|||
|
|
| 方法 | 描述 |
|
|||
|
|
|------|------|
|
|||
|
|
| `void Clear()` | 清空所有分配,下一次分配从头开始 |
|
|||
|
|
| `void* GetMarker() const` | 获取当前分配位置标记 |
|
|||
|
|
| `void SetMarker(void* marker)` | 恢复到指定标记位置 |
|
|||
|
|
|
|||
|
|
### 状态查询
|
|||
|
|
|
|||
|
|
| 方法 | 描述 |
|
|||
|
|
|------|------|
|
|||
|
|
| `size_t GetUsedSize() const` | 获取已使用的字节数 |
|
|||
|
|
| `size_t GetCapacity() const` | 获取总容量 |
|
|||
|
|
|
|||
|
|
### 统计
|
|||
|
|
|
|||
|
|
| 方法 | 描述 |
|
|||
|
|
|------|------|
|
|||
|
|
| `size_t GetTotalAllocated() const` | 返回已使用字节数 |
|
|||
|
|
| `size_t GetTotalFreed() const` | 返回 0 |
|
|||
|
|
| `size_t GetPeakAllocated() const` | 返回容量大小 |
|
|||
|
|
| `size_t GetAllocationCount() const` | 返回 0 |
|
|||
|
|
|
|||
|
|
## 使用示例
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
// 创建 1MB 的线性分配器
|
|||
|
|
auto allocator = std::make_unique<LinearAllocator>(1024 * 1024);
|
|||
|
|
|
|||
|
|
// 分配临时内存
|
|||
|
|
void* ptr1 = allocator->Allocate(256);
|
|||
|
|
void* ptr2 = allocator->Allocate(512);
|
|||
|
|
void* ptr3 = allocator->Allocate(128);
|
|||
|
|
|
|||
|
|
// 保存标记
|
|||
|
|
void* marker = allocator->GetMarker();
|
|||
|
|
|
|||
|
|
// 分配一些临时内存
|
|||
|
|
void* temp = allocator->Allocate(64);
|
|||
|
|
|
|||
|
|
// 恢复到标记位置(释放 temp)
|
|||
|
|
allocator->SetMarker(marker);
|
|||
|
|
|
|||
|
|
// 每帧结束时清空
|
|||
|
|
allocator->Clear();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 相关文档
|
|||
|
|
|
|||
|
|
- [IAllocator](./memory-allocator.md) - 分配器接口
|
|||
|
|
- [PoolAllocator](./memory-pool-allocator.md) - 内存池分配器
|
|||
|
|
- [ProxyAllocator](./memory-proxy-allocator.md) - 代理分配器
|