improved AccumMemoryManager
This commit is contained in:
parent
9265a26b87
commit
924f4ab9f3
@ -1,12 +1,13 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include<hgl/type/List.h>
|
||||||
#include<hgl/type/DataArray.h>
|
#include<hgl/type/DataArray.h>
|
||||||
|
|
||||||
namespace hgl
|
namespace hgl
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* 累计内存管理<br>
|
* 累计内存管理<br>
|
||||||
* 用于不断分配固定容量的内存块,但不动态调整,最后统一释放的情况。
|
* 用于不断分配固定容量的内存块,但不动态调整,最后统一释放的情况。
|
||||||
*/
|
*/
|
||||||
class AccumMemoryManager
|
class AccumMemoryManager
|
||||||
{
|
{
|
||||||
@ -20,43 +21,44 @@ namespace hgl
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
int64 total_bytes=0; ///<总字节数
|
List<Block> block_list; ///<数据块列表
|
||||||
|
DataArray<char> data_array; ///<数据
|
||||||
DataArray<AccumMemoryManager::Block> block_list;
|
|
||||||
DataArray<char> data_array; ///<数据
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
AccumMemoryManager()=default;
|
AccumMemoryManager()=default;
|
||||||
~AccumMemoryManager()=default;
|
~AccumMemoryManager()=default;
|
||||||
|
|
||||||
const int64 GetTotalBytes()const{return total_bytes;}
|
const int64 GetTotalBytes()const{return data_array.GetBytes();} ///<取得总共申请的内存总字节数
|
||||||
const int64 GetBlockCount()const{return block_list.GetCount();}
|
const int64 GetBlockCount()const{return block_list.GetCount();} ///<取得内存数据块数量
|
||||||
|
|
||||||
const void *Acquire(const int64 size)
|
Block *Acquire(const int64 size) ///<申请一块内存
|
||||||
{
|
{
|
||||||
if(size<=0)return(nullptr);
|
if(size<=0)return(nullptr);
|
||||||
|
|
||||||
Block b;
|
Block *b=block_list.Add();
|
||||||
|
|
||||||
b.offset=total_bytes;
|
b->offset =data_array.GetBytes();
|
||||||
b.size=size;
|
b->size =size;
|
||||||
|
|
||||||
data_array.AddCount(size);
|
data_array.AddCount(size);
|
||||||
|
|
||||||
return data_array.GetPointer(b.offset);
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *Access(const Block *b) ///<访问一块内存
|
||||||
|
{
|
||||||
|
return b?data_array.GetPointer(b->offset):nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Clear()
|
void Clear()
|
||||||
{
|
{
|
||||||
total_bytes=0;
|
|
||||||
block_list.Clear();
|
block_list.Clear();
|
||||||
data_array.Clear();
|
data_array.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Free()
|
void Free()
|
||||||
{
|
{
|
||||||
total_bytes=0;
|
|
||||||
block_list.Free();
|
block_list.Free();
|
||||||
data_array.Free();
|
data_array.Free();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user