fix: improve doc link navigation and tree display
- Fix link resolution with proper relative/absolute path handling - Improve link styling with underline decoration - Hide leaf nodes from tree, only show directories - Fix log file path for packaged app
This commit is contained in:
37
docs/api/memory/proxy-allocator/allocate.md
Normal file
37
docs/api/memory/proxy-allocator/allocate.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# ProxyAllocator::Allocate
|
||||
|
||||
```cpp
|
||||
void* Allocate(size_t size, size_t alignment = 0) override;
|
||||
```
|
||||
|
||||
分配内存并记录统计。调用转发到底层分配器,同时递增分配计数和总分配字节数,并更新峰值记录。
|
||||
|
||||
**参数:**
|
||||
- `size` - 请求的字节数
|
||||
- `alignment` - 内存对齐要求
|
||||
|
||||
**返回:** 分配成功返回指针,失败返回 `nullptr`
|
||||
|
||||
**复杂度:** O(1)(底层分配器复杂度 + 统计更新)
|
||||
|
||||
**示例:**
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/MemoryManager.h>
|
||||
#include <XCEngine/Memory/ProxyAllocator.h>
|
||||
|
||||
IAllocator* sysAlloc = MemoryManager::Get().GetSystemAllocator();
|
||||
ProxyAllocator proxy(sysAlloc, "TrackedAlloc");
|
||||
|
||||
void* p1 = proxy.Allocate(100);
|
||||
void* p2 = proxy.Allocate(200);
|
||||
void* p3 = proxy.Allocate(300, 16);
|
||||
|
||||
const auto& stats = proxy.GetStats();
|
||||
printf("Total: %zu, Peak: %zu, Count: %zu\n",
|
||||
stats.totalAllocated, stats.peakAllocated, stats.allocationCount);
|
||||
```
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [ProxyAllocator 总览](proxy-allocator.md) - 返回类总览
|
||||
42
docs/api/memory/proxy-allocator/free.md
Normal file
42
docs/api/memory/proxy-allocator/free.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# ProxyAllocator::Free
|
||||
|
||||
```cpp
|
||||
void Free(void* ptr) override;
|
||||
```
|
||||
|
||||
释放内存并记录统计。调用转发到底层分配器,同时更新统计信息:递增 `totalFreed`(累加当前 `allocationCount`),并递减 `allocationCount`。
|
||||
|
||||
**注意:** `totalFreed` 累加的是每次释放时的 `allocationCount`(分配计数)而非实际字节大小。这是一个简化的实现,用于追踪释放操作次数。
|
||||
|
||||
**参数:**
|
||||
- `ptr` - 指向要释放的内存块
|
||||
|
||||
**返回:** 无
|
||||
|
||||
**复杂度:** O(1)(底层释放 + 统计更新)
|
||||
|
||||
**示例:**
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/MemoryManager.h>
|
||||
#include <XCEngine/Memory/ProxyAllocator.h>
|
||||
|
||||
IAllocator* sysAlloc = MemoryManager::Get().GetSystemAllocator();
|
||||
ProxyAllocator proxy(sysAlloc, "TrackedAlloc");
|
||||
|
||||
void* p1 = proxy.Allocate(512);
|
||||
void* p2 = proxy.Allocate(256);
|
||||
|
||||
proxy.Free(p1);
|
||||
proxy.Free(p2);
|
||||
|
||||
const auto& stats = proxy.GetStats();
|
||||
// totalFreed 累加了每次释放时的 allocationCount(次数,非字节)
|
||||
// allocationCount 最终为 0
|
||||
printf("Total allocated: %zu bytes, Freed count: %zu, Current count: %zu\n",
|
||||
stats.totalAllocated, stats.totalFreed, stats.allocationCount);
|
||||
```
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [ProxyAllocator 总览](proxy-allocator.md) - 返回类总览
|
||||
40
docs/api/memory/proxy-allocator/get-stats.md
Normal file
40
docs/api/memory/proxy-allocator/get-stats.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# ProxyAllocator::GetStats
|
||||
|
||||
```cpp
|
||||
const Stats& GetStats() const;
|
||||
```
|
||||
|
||||
返回详细的统计信息结构体引用。包含累计分配、累计释放、峰值分配、分配次数和额外开销。返回 const 引用,无锁开销(内部已有互斥保护)。
|
||||
|
||||
**参数:** 无
|
||||
|
||||
**返回:** Stats 结构体 const 引用
|
||||
|
||||
**复杂度:** O(1)
|
||||
|
||||
**示例:**
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/MemoryManager.h>
|
||||
#include <XCEngine/Memory/ProxyAllocator.h>
|
||||
|
||||
IAllocator* sysAlloc = MemoryManager::Get().GetSystemAllocator();
|
||||
ProxyAllocator proxy(sysAlloc, "FrameData");
|
||||
|
||||
proxy.Allocate(1024);
|
||||
proxy.Allocate(512);
|
||||
proxy.Free(proxy.Allocate(256));
|
||||
|
||||
const ProxyAllocator::Stats& stats = proxy.GetStats();
|
||||
printf("Total allocated: %zu bytes\n", stats.totalAllocated);
|
||||
printf("Total freed: %zu times\n", stats.totalFreed);
|
||||
printf("Peak allocated: %zu bytes\n", stats.peakAllocated);
|
||||
printf("Allocation count: %zu\n", stats.allocationCount);
|
||||
printf("Memory overhead: %zu bytes\n", stats.memoryOverhead);
|
||||
printf("Current in use: %zu bytes\n",
|
||||
stats.totalAllocated - stats.allocationCount * sizeof(/* typical block */ size_t));
|
||||
```
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [ProxyAllocator 总览](proxy-allocator.md) - 返回类总览
|
||||
61
docs/api/memory/proxy-allocator/proxy-allocator.md
Normal file
61
docs/api/memory/proxy-allocator/proxy-allocator.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# ProxyAllocator
|
||||
|
||||
**命名空间**: `XCEngine::Memory`
|
||||
|
||||
**类型**: `class`
|
||||
|
||||
**描述**: 代理分配器,用于统计和跟踪底层分配器的分配情况。
|
||||
|
||||
## 概述
|
||||
|
||||
`ProxyAllocator` 包装一个底层分配器,转发所有分配请求,同时记录详细的统计信息。它线程安全(使用互斥锁保护统计数据),适合需要监控内存使用的场景。
|
||||
|
||||
## 公共方法
|
||||
|
||||
| 方法 | 描述 |
|
||||
|------|------|
|
||||
| `ProxyAllocator` | 构造代理分配器 |
|
||||
| `~ProxyAllocator` | 析构函数 |
|
||||
| `Allocate` | 分配内存并记录统计 |
|
||||
| `Free` | 释放内存并记录统计 |
|
||||
| `Reallocate` | 转发到底层分配器 |
|
||||
| `GetStats` | 获取详细统计信息 |
|
||||
|
||||
## 构造函数
|
||||
|
||||
```cpp
|
||||
ProxyAllocator(IAllocator* underlying, const char* name);
|
||||
```
|
||||
|
||||
构造一个代理分配器,包装底层分配器并记录分配统计。所有 `Allocate`、`Free`、`Reallocate` 调用都会被转发到底层分配器,同时记录统计信息。名称用于日志和报告。
|
||||
|
||||
**参数:**
|
||||
- `underlying` - 被包装的底层分配器,不能为 `nullptr`
|
||||
- `name` - 代理分配器的名称字符串
|
||||
|
||||
**返回:** 无
|
||||
|
||||
**复杂度:** O(1)
|
||||
|
||||
**示例:**
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/MemoryManager.h>
|
||||
#include <XCEngine/Memory/ProxyAllocator.h>
|
||||
|
||||
MemoryManager::Get().Initialize();
|
||||
|
||||
// 使用系统分配器作为底层
|
||||
IAllocator* sysAlloc = MemoryManager::Get().GetSystemAllocator();
|
||||
ProxyAllocator proxy(sysAlloc, "TempAllocations");
|
||||
|
||||
// 通过代理分配
|
||||
void* ptr = proxy.Allocate(1024);
|
||||
proxy.Free(ptr);
|
||||
```
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [Memory 模块总览](../memory.md) - 返回模块总览
|
||||
- [IAllocator](../allocator/allocator.md) - 分配器接口
|
||||
- [MemoryManager](../manager/manager.md) - 内存管理器
|
||||
38
docs/api/memory/proxy-allocator/reallocate.md
Normal file
38
docs/api/memory/proxy-allocator/reallocate.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# ProxyAllocator::Reallocate
|
||||
|
||||
```cpp
|
||||
void* Reallocate(void* ptr, size_t newSize) override;
|
||||
```
|
||||
|
||||
重新分配内存。调用转发到底层分配器,不记录额外统计信息(底层分配器的返回值直接返回)。此方法线程安全,内部使用互斥锁保护。
|
||||
|
||||
**参数:**
|
||||
- `ptr` - 现有内存块指针
|
||||
- `newSize` - 新的字节大小
|
||||
|
||||
**返回:** 成功返回新指针,失败返回 `nullptr`(由底层分配器决定)
|
||||
|
||||
**复杂度:** O(n)(底层分配器 + 数据复制)
|
||||
|
||||
**示例:**
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/MemoryManager.h>
|
||||
#include <XCEngine/Memory/ProxyAllocator.h>
|
||||
|
||||
IAllocator* sysAlloc = MemoryManager::Get().GetSystemAllocator();
|
||||
ProxyAllocator proxy(sysAlloc, "TrackedAlloc");
|
||||
|
||||
void* p1 = proxy.Allocate(128);
|
||||
void* p2 = proxy.Reallocate(p1, 256);
|
||||
|
||||
if (p2) {
|
||||
// 重新分配成功
|
||||
} else {
|
||||
// 失败,p1 仍然有效
|
||||
}
|
||||
```
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [ProxyAllocator 总览](proxy-allocator.md) - 返回类总览
|
||||
37
docs/api/memory/proxy-allocator/~proxy-allocator.md
Normal file
37
docs/api/memory/proxy-allocator/~proxy-allocator.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# ProxyAllocator::~ProxyAllocator
|
||||
|
||||
```cpp
|
||||
~ProxyAllocator() override;
|
||||
```
|
||||
|
||||
销毁代理分配器。此析构函数不释放底层分配器,只清理代理分配器自身的统计信息(互斥锁等)。底层分配器由创建者负责管理。
|
||||
|
||||
**参数:** 无
|
||||
|
||||
**返回:** 无
|
||||
|
||||
**注意:** 析构函数不释放底层分配器。如果需要释放底层分配器,应先调用 `Shutdown` 或显式销毁底层分配器。
|
||||
|
||||
**示例:**
|
||||
|
||||
```cpp
|
||||
#include <XCEngine/Memory/MemoryManager.h>
|
||||
#include <XCEngine/Memory/ProxyAllocator.h>
|
||||
|
||||
{
|
||||
MemoryManager::Get().Initialize();
|
||||
IAllocator* sysAlloc = MemoryManager::Get().GetSystemAllocator();
|
||||
|
||||
auto proxy = MemoryManager::Get().CreateProxyAllocator("TrackedAlloc");
|
||||
proxy->Allocate(1024);
|
||||
|
||||
// proxy 超出作用域时自动销毁
|
||||
// 底层 sysAlloc 仍有效
|
||||
|
||||
MemoryManager::Get().Shutdown();
|
||||
}
|
||||
```
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [ProxyAllocator 总览](proxy-allocator.md) - 返回类总览
|
||||
Reference in New Issue
Block a user