1.内存池数据结构示意图:
2.下面是完整实现代码包括与常规new,delete分配内存性能对比:
#include <Windows.h>
#include <iostream>
#include <map>
#include <assert.h>
#include <map>
#include <vector>
#include <time.h>
typedef int s32;
typedef unsigned int u32;
typedef char c8;
typedef long long s64;
typedef unsigned long long u64;
typedef void* LPVOID;
typedef unsigned char* LPBYTE;
//锁对象封装
class LockObject
{
public:
LockObject()
{
InitializeCriticalSection(&mLock);
}
~LockObject()
{
DeleteCriticalSection(&mLock);
}
void Lock()
{
EnterCriticalSection(&mLock);
}
void UnLock()
{
LeaveCriticalSection(&mLock);
}
bool TryLock()
{
return TryEnterCriticalSection(&mLock);
}
private:
LockObject(const LockObject &other)
{}
LockObject& operator = (const LockObject &other)
{}
private:
CRITICAL_SECTION mLock;
};
//锁定区域对象封装
class ScopeLock
{
public:
ScopeLock(CRITICAL_SECTION &lock)
:mlock(lock)
{
EnterCriticalSection(&mlock);
}
ScopeLock(LockObject &lock)
:mlock( reinterpret_cast<CRITICAL_SECTION&>(lock) )
{
EnterCriticalSection(&mlock);
}
~ScopeLock()
{
LeaveCriticalSection(&mlock);
}
private:
ScopeLock( const ScopeLock &other)
:mlock(other.mlock)
{}
ScopeLock& operator = (const ScopeLock &other)
{}
private:
CRITICAL_SECTION &mlock;
};
//内存块结构
typedef struct MemoryChunk
{
u64 mID; //块ID
LPVOID mpData; //真正的提供给外部分配内存
u64 mDataSize; //管理数据块的大小
u64 mUsedSize; //使用数据块大小
MemoryChunk *mpNext;//下一个块
}* MemoryChunkPtr;
//内存池完整实现
class MemoryPool
{
public:
MemoryPool(u64 MemoryBlockSize, u64 MemoryChunkSize )
{
mTotalMemoryPoolSize =
mUsedMemorySize =
mFreeMemorySize =
mChunkIDPool = 0;
mpBeginChunk =
mpNearFreeChunk =
mpEndChunk = nu