简明分析C/C++内存分配的解决方案(2)
CMemoryPool(const std::size_t &sInitialMemoryPoolSize = DEFAULT_MEMORY_POOL_SIZE,
const std::size_t &sMemoryChunkSize = DEFAULT_MEMORY_CHUNK_SIZE,
const std::size_t &sMinimalMemorySizeToAllocate = DEFAULT_MEMORY_SIZE_TO_ALLOCATE,
bool bSetMemoryData = false
);
virtual ~CMemoryPool();
//从内存池中申请内存
virtual void* GetMemory(const std::size_t &sMemorySize);
virtual void FreeMemory(void *ptrMemoryBlock, const std::size_t &sMemoryBlockSize);
private:
//申请内存OS
bool AllocateMemory(const std::size_t &sMemorySize);
void FreeAllAllocatedMemory();
//计算可以分多少块
unsigned int CalculateNeededChunks(const std::size_t &sMemorySize);
//计算内存池最合适的大小
std::size_t CMemoryPool::CalculateBestMemoryBlockSize(const std::size_t &sRequestedMemoryBlockSize);
//建立链表.每个结点Data指针指向内存池中的内存地址
bool LinkChunksToData(SMemoryChunk* ptrNewChunks, unsigned int uiChunkCount, TByte* ptrNewMemBlock);
//重新计算块(Chunk)的大小1024--896--768--640--512------------
bool RecalcChunkMemorySize(SMemoryChunk* ptrChunk, unsigned int uiChunkCount);
SMemoryChunk* SetChunkDefaults(SMemoryChunk *ptrChunk);
//搜索链表找到一个能够持有被申请大小的内存块(Chunk).如果它返回NULL,那么在内存池中没有可用的内存
SMemoryChunk* FindChunkSuitableToHoldMemory(const std::size_t &sMemorySize);
std::size_t MaxValue(const std::size_t &sValueA, const std::size_t &sValueB) const;
void SetMemoryChunkValues(SMemoryChunk *ptrChunk, const std::size_t &sMemBlockSize);
SMemoryChunk* SkipChunks(SMemoryChunk *ptrStartChunk, unsigned int uiChunksToSkip);
private:
SMemoryChunk *m_ptrFirstChunk;
SMemoryChunk *m_ptrLastChunk;
SMemoryChunk *m_ptrCursorChunk;
std::size_t m_sTotalMemoryPoolSize; //内存池的总大小
std::size_t m_sUsedMemoryPoolSize; //以使用内存的大小
std::size_t m_sFreeMemoryPoolSize; //可用内存的大小
std::size_t m_sMemoryChunkSize; //块(Chunk)的大小
unsigned int m_uiMemoryChunkCount; //块(Chunk)的数量
unsigned int m_uiObjectCount;
bool m_bSetMemoryData ;
std::size_t m_sMinimalMemorySizeToAllocate;
};
#endif
CMemoryPool.h