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