C/C++的記憶體配置(通過malloc或new)可能需要花費很多時。
更糟糕的是,隨 著時間的流逝,記憶體(memory)將形成片段,所以一個應用程式的運行會越來越慢。當它 運行了很長時間和/或執行了很多的記憶體配置(釋放)操作的時候。特別是,你經常申請 很小的一塊記憶體,堆(heap)會變成片段的。
解決方案:你自己的記憶體池一個( 可能的)解決方案是記憶體池(Memory Pool)。
在啟動的時候,一個“記憶體 池”(Memory Pool)分配一塊很大的記憶體,並將會將這個大塊(block)分成較小 的塊(smaller chunks)。每次你從記憶體池申請記憶體空間時,它會從先前已經分配的塊( chunks)中得到,而不是從作業系統。最大的優勢在於:
1:非常少(幾沒有) 堆片段
2: 比通常的記憶體申請/釋放(比如通過malloc, new等)的方式快另外, 你可以得到以下好處:1:檢查任何一個指標是否在記憶體池裡2:寫一個“堆轉儲 (Heap-Dump)”到你的硬碟(對事後的調試非常有用)
3: 某種“內 存泄漏檢測(memory-leak detection)”:當你沒有釋放所有以前分配的記憶體時, 記憶體池(Memory Pool)會拋出一個斷言(assertion)。
SMemoryChunk.h
#ifndef __SMEMORYCHUNK_H__
#define __SMEMORYCHUNK_H__
typedef unsigned char TByte ;
struct SMemoryChunk
{
TByte *Data; //資料
std::size_t DataSize; //該記憶體塊的總大小
std::size_t UsedSize; //實際使用的大小
bool IsAllocationChunk;
SMemoryChunk *Next; //指向鏈表中下一個塊的指標。
};
#endif
IMemoryBlock.h
#ifndef __IMEMORYBLOCK_H__
#define __IMEMORYBLOCK_H__
class IMemoryBlock
{
public :
virtual ~IMemoryBlock() {};
virtual void *GetMemory(const std::size_t &sMemorySize) = 0;
virtual void FreeMemory(void *ptrMemoryBlock, const std::size_t &sMemoryBlockSize) = 0;
};
#endif