VC 記憶體池

來源:互聯網
上載者:User

用stl中的list分別儲存使用的記憶體塊和未使用的記憶體塊,記憶體預設分為4個位元組一塊,如果設定過大,可能浪費記憶體,設定過小,可能影響效能
#include <Windows.h>#include <iostream>#include <list>#include <stdio.h>#include <tchar.h>#define WM_ARRANGE (WM_USER+1)using namespace std;DWORD WINAPI MainThreadProc(LPVOID lpParam);struct MemoryInfo{byte * MemoryAddress;DWORD MemoryBlockNum; bool operator < (const MemoryInfo& MI){return MemoryAddress <MI.MemoryAddress;}};class __declspec(dllexport) MemoryPool{private:list<MemoryInfo> UsedMemory;list<MemoryInfo> UnUsedMemory;int i;WORD MemoryBlockSize;CRITICAL_SECTION g_cs;DWORD ThreadID;DWORD Arrange_Index;DWORD ExtraNew;void * StartAddress;DWORD TotalBlockNum;DWORD TotalNew;public:MemoryPool(DWORD Size,WORD MemoryBlockSize=4);void* GetMemory(DWORD Size);void FreeMemory(void * address);void Arrage();void Collect();DWORD GetExtraNew();~MemoryPool();};DWORD MemoryPool::GetExtraNew(){return ExtraNew;}MemoryPool::~MemoryPool(){delete[] StartAddress;}void MemoryPool::Collect(){memset(StartAddress,'\0',TotalBlockNum*MemoryBlockSize);UnUsedMemory.clear();UsedMemory.clear();MemoryInfo MI;MI.MemoryAddress=(byte *)StartAddress;MI.MemoryBlockNum=TotalBlockNum;UnUsedMemory.push_back(MI);}MemoryPool::MemoryPool(DWORD Size,WORD MemoryBlockSize){MemoryInfo MI;MI.MemoryBlockNum=Size/MemoryBlockSize+1;TotalBlockNum=MI.MemoryBlockNum;MI.MemoryAddress=new byte[MI.MemoryBlockNum*MemoryBlockSize];StartAddress=MI.MemoryAddress;UnUsedMemory.push_back(MI);this->MemoryBlockSize=MemoryBlockSize;CreateThread(NULL,0,MainThreadProc,this,0,&ThreadID);Arrange_Index=MI.MemoryBlockNum/6;InitializeCriticalSection(&g_cs);cout<<"總記憶體塊數:"<<MI.MemoryBlockNum<<endl;ExtraNew=0;TotalNew=0;}void * MemoryPool::GetMemory(DWORD Size){TotalNew++;EnterCriticalSection(&g_cs);WORD NeedBlockNum=Size/MemoryBlockSize;NeedBlockNum+=Size%MemoryBlockSize?1:0;list<MemoryInfo>::iterator it_UnUsedMemory=UnUsedMemory.end();do {it_UnUsedMemory--;if (NeedBlockNum<=(it_UnUsedMemory->MemoryBlockNum)){MemoryInfo MI;MI.MemoryAddress=it_UnUsedMemory->MemoryAddress;printf("申請:地址:%x佔有記憶體塊數:%u\n",MI.MemoryAddress,NeedBlockNum);it_UnUsedMemory->MemoryBlockNum-=NeedBlockNum;it_UnUsedMemory->MemoryAddress=it_UnUsedMemory->MemoryAddress+NeedBlockNum*MemoryBlockSize;printf("變了的地址為:%x\n",it_UnUsedMemory->MemoryAddress);MI.MemoryBlockNum=NeedBlockNum;UsedMemory.push_back(MI);if (it_UnUsedMemory->MemoryBlockNum==0){UnUsedMemory.erase(it_UnUsedMemory);}LeaveCriticalSection(&g_cs);return MI.MemoryAddress;}} while (it_UnUsedMemory!=UnUsedMemory.begin());LeaveCriticalSection(&g_cs);cout<<"額外申請"<<endl;byte* newMemory=new byte[Size];PostThreadMessage(ThreadID,WM_ARRANGE,NULL,NULL);ExtraNew++;return newMemory;}void MemoryPool::FreeMemory(void * address){bool IsInExtra=false;list<MemoryInfo>::iterator it_UsedMemory=UsedMemory.begin();MemoryInfo MI;do {if (it_UsedMemory->MemoryAddress==address){MI.MemoryAddress=(byte *)address;MI.MemoryBlockNum=it_UsedMemory->MemoryBlockNum;UnUsedMemory.push_back(MI);memset(MI.MemoryAddress,'\0',MI.MemoryBlockNum*MemoryBlockSize);// printf("地址:%x\n",it_UsedMemory->MemoryAddress);UsedMemory.erase(it_UsedMemory);   IsInExtra=true;break;}it_UsedMemory++;} while (it_UsedMemory!=UsedMemory.end());//cout<<"數量:"<<UnUsedMemory.size()<<endl;if (UnUsedMemory.size()>=Arrange_Index){PostThreadMessage(ThreadID,WM_ARRANGE,NULL,NULL);}if (!IsInExtra){delete[] address;}}void MemoryPool::Arrage(){EnterCriticalSection(&g_cs);cout<<"開始整理........."<<endl;UnUsedMemory.sort();list<MemoryInfo>::iterator it_UnUsedMemory;for (it_UnUsedMemory=UnUsedMemory.begin();it_UnUsedMemory!=UnUsedMemory.end();it_UnUsedMemory++){printf("%x空餘記憶體塊數:%u\n",it_UnUsedMemory->MemoryAddress,it_UnUsedMemory->MemoryBlockNum);}it_UnUsedMemory=UnUsedMemory.begin();do {byte * EndAddress=it_UnUsedMemory->MemoryAddress+(it_UnUsedMemory->MemoryBlockNum)*MemoryBlockSize;  //   printf("Endaddress:%x\n",EndAddress);it_UnUsedMemory++;if (EndAddress==it_UnUsedMemory->MemoryAddress){DWORD MN=it_UnUsedMemory->MemoryBlockNum;UnUsedMemory.erase(it_UnUsedMemory--);it_UnUsedMemory->MemoryBlockNum+=MN;}} while (it_UnUsedMemory!=UnUsedMemory.end());for (it_UnUsedMemory=UnUsedMemory.begin();it_UnUsedMemory!=UnUsedMemory.end();it_UnUsedMemory++){printf("整理結果:%x記憶體塊:%u\n",it_UnUsedMemory->MemoryAddress,it_UnUsedMemory->MemoryBlockNum);}LeaveCriticalSection(&g_cs);cout<<"整理完畢........."<<endl;cout<<"額外申請次數:"<<ExtraNew<<endl;cout<<"總申請次數:"<<TotalNew<<endl;}DWORD WINAPI MainThreadProc(LPVOID lpParam){MSG msg;MemoryPool *MP=(MemoryPool*)lpParam;PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);while(true){if(GetMessage(&msg,0,0,0)) //get msg from message queue{switch(msg.message){case WM_ARRANGE:MP->Arrage();break;}}};return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.