龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

简明分析C/C++内存分配的解决方案(2)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
CMemoryPool(const std::size_t sMemoryChunkSize = DEFAULT_MEMORY_CHUNK_SIZE, const std::size_t virtual ~CMemoryPool(); //从内存池中申请内存 virtual void* GetMemory(const std::size_t virtual vo

  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

精彩图集

赞助商链接