FreeList内存管理初步尝试

    技术2022-05-19  30

    上次分析字体文件的时候,就考虑了要做个内存管理,读取文件时候的不断malloc,确实给效率带来极大的影响。这次初步尝试了freelist内存管理的设计,意识到了内存管理在整个数据结构设计中的作用。跟以前对比的话,以前设计数据结构只考虑其节点访问复杂度,而这次从整个系统耗时复杂度角度出发。

     

    设计数据结构应该考虑三个方面,对象的创建和释放,对象的访问耗时,对象存储空间。

     

    内存管理的本质是减少malloc,free次数。

     

    所以从另一个角度看,内存管理的设计是和数据结构紧密结合的,也就是内存管理的设计其本质是数据结构的设计,freelist只是其中的一种方法,确切更好的内存管理应该结合实际创建和释放行为来考虑。

     

    还有一点关于学习方法的,应该以一个开放,共享,交流的心态来处理,才进步得最快。在这次内存管理的初步接触中,只是稍微看了下相关资料后,大部分是和重哥讨论中觉悟出来,打通了这块的经脉,有了个概念,处理起来得心应手。

     

    下面是一小块代码,留个纪念。

    #include <memory.h> #include <stdlib.h> class MemoryManager { private: enum {data_size = 1024}; struct FreeList { FreeList* next; }; struct MemoryPool { MemoryPool* next; char data[data_size]; }; int m_nDataBlocks; FreeList* m_pFreeListHeader; MemoryPool* m_pMemoryHeader; MemoryPool* m_pCurrMemoryPos; public: MemoryManager(int nDataBlocks); ~MemoryManager(); public: void* Malloc(); void Free(void* pointer); }; 

     

    // //xuexuankr 2011/3/4 memorypool //总体思路为:used和unused内存,unused由freelist管理,used的就扔出去管理,而MemoryPool做地址控制,为内存释放做标志。 // #include <stdio.h> #include "MemoryManager.h" MemoryManager::MemoryManager(int nDataBlocks = 8):m_nDataBlocks(nDataBlocks), m_pFreeListHeader(NULL), m_pMemoryHeader(NULL), m_pCurrMemoryPos(NULL) { } MemoryManager::~MemoryManager() { if (m_pMemoryHeader) { MemoryPool* pCurrBlock = m_pMemoryHeader; while (pCurrBlock) { MemoryPool* pTmp = pCurrBlock->next; delete pCurrBlock; pCurrBlock = pTmp; } } } //注意越界问题 void* MemoryManager::Malloc() { if (!m_pFreeListHeader) { MemoryPool* pBlock = (MemoryPool*)malloc(sizeof(MemoryPool)); pBlock->next = NULL; char* data_curr = pBlock->data; char* data_end = pBlock->data + data_size; m_pFreeListHeader = (FreeList*)data_curr; //data_curr += m_nDataBlocks;//这样操作,不需要下层的入口判断 FreeList* pCurrListNode = m_pFreeListHeader; while ((data_curr + m_nDataBlocks) < data_end) { data_curr += m_nDataBlocks; pCurrListNode->next = (FreeList*)data_curr; pCurrListNode = pCurrListNode->next; //data_curr += m_nDataBlocks; } if (!m_pMemoryHeader) m_pMemoryHeader = pBlock; else m_pCurrMemoryPos->next = pBlock; m_pCurrMemoryPos = pBlock; } FreeList* pNode = m_pFreeListHeader; m_pFreeListHeader = m_pFreeListHeader->next; return pNode; } void MemoryManager::Free(void* pointer) { if (!pointer) return ; ((FreeList*)pointer)->next = m_pFreeListHeader; m_pFreeListHeader = (FreeList*)pointer; }  


    最新回复(0)