上次分析字型檔的時候,就考慮了要做個記憶體管理,讀取檔案時候的不斷malloc,確實給效率帶來極大的影響。這次初步嘗試了freelist記憶體管理的設計,意識到了記憶體管理在整個資料結構設計中的作用。跟以前對比的話,以前設計資料結構只考慮其節點訪問複雜度,而這次從整個系統耗時複雜度角度出發。
設計資料結構應該考慮三個方面,對象的建立和釋放,對象的訪問耗時,Object Storage Service空間。
記憶體管理的本質是減少malloc,free次數。
所以從另一個角度看,記憶體管理的設計是和資料結構緊密結合的,也就是記憶體管理的設計其本質是資料結構的設計,freelist只是其中的一種方法,確切更好的記憶體管理應該結合實際建立和釋允許存取為來考慮。
還有一點關於學習方法的,應該以一個開放,共用,交流的心態來處理,才進步得最快。在這次記憶體管理的初步接觸中,只是稍微看了下相關資料後,大部分是和重哥討論中覺悟出來,打通了這塊的經脈,有了個概念,處理起來得心應手。
下面是一小塊代碼,留個紀念。
#include <memory.h><br />#include <stdlib.h><br />class MemoryManager<br />{<br />private:<br />enum {data_size = 1024};<br />struct FreeList<br />{<br />FreeList* next;<br />};<br />struct MemoryPool<br />{<br />MemoryPool* next;<br />char data[data_size];<br />};<br />int m_nDataBlocks;<br />FreeList* m_pFreeListHeader;<br />MemoryPool* m_pMemoryHeader;<br />MemoryPool* m_pCurrMemoryPos;<br />public:<br />MemoryManager(int nDataBlocks);<br />~MemoryManager();<br />public:<br />void* Malloc();<br />void Free(void* pointer);<br />};
//<br />//xuexuankr 2011/3/4 memorypool<br />//總體思路為:used和unused記憶體,unused由freelist管理,used的就扔出去管理,而MemoryPool做地址控制,為記憶體釋放做標誌。<br />//<br />#include <stdio.h><br />#include "MemoryManager.h"<br />MemoryManager::MemoryManager(int nDataBlocks = 8):m_nDataBlocks(nDataBlocks),<br /> m_pFreeListHeader(NULL),<br /> m_pMemoryHeader(NULL),<br /> m_pCurrMemoryPos(NULL)<br />{<br />}<br />MemoryManager::~MemoryManager()<br />{<br />if (m_pMemoryHeader)<br />{<br />MemoryPool* pCurrBlock = m_pMemoryHeader;<br />while (pCurrBlock)<br />{<br />MemoryPool* pTmp = pCurrBlock->next;<br />delete pCurrBlock;<br />pCurrBlock = pTmp;<br />}<br />}<br />}<br />//注意越界問題<br />void* MemoryManager::Malloc()<br />{<br />if (!m_pFreeListHeader)<br />{<br />MemoryPool* pBlock = (MemoryPool*)malloc(sizeof(MemoryPool));<br />pBlock->next = NULL;<br />char* data_curr = pBlock->data;<br />char* data_end = pBlock->data + data_size;<br />m_pFreeListHeader = (FreeList*)data_curr;<br />//data_curr += m_nDataBlocks;//這樣操作,不需要下層的入口判斷<br />FreeList* pCurrListNode = m_pFreeListHeader;<br />while ((data_curr + m_nDataBlocks) < data_end)<br />{<br />data_curr += m_nDataBlocks;<br />pCurrListNode->next = (FreeList*)data_curr;<br />pCurrListNode = pCurrListNode->next;<br />//data_curr += m_nDataBlocks;<br />}<br />if (!m_pMemoryHeader)<br />m_pMemoryHeader = pBlock;<br />else<br />m_pCurrMemoryPos->next = pBlock;<br />m_pCurrMemoryPos = pBlock;<br />}<br />FreeList* pNode = m_pFreeListHeader;<br />m_pFreeListHeader = m_pFreeListHeader->next;<br />return pNode;<br />}<br />void MemoryManager::Free(void* pointer)<br />{<br />if (!pointer)<br />return ;<br />((FreeList*)pointer)->next = m_pFreeListHeader;<br />m_pFreeListHeader = (FreeList*)pointer;<br />}<br />