程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c++內存優化:二級間接索引模式內存池

c++內存優化:二級間接索引模式內存池

編輯:關於C語言

.H內容如下:

  1. /********************************************************* 
  2. 在一些不確定內存總占用量的情形下,頻繁的使用new申請內存,再通過鏈表 
  3. 進行索引似乎是很常規的做法。自然,也很難做到隨機定位。 
  4. 下面的內存池類是用二層索引表來對內存進行大塊劃分,任何一個塊均只需索 
  5. 引3次即可定位。 
  6. 索引數量,每索引塊的分配單元數量,以及分配單元的字節長度均需為2的整數 
  7. 次冪(為了運算時的效率)
  8. //by:www.datahf.net zhangyu(zhangyu.blog.51cto.com) 
  9. *********************************************************/ 
  10. class MemTable 
  11. public: 
  12.     MemTable(void); 
  13. public: 
  14.     ~MemTable(void); 
  15. public: 
  16.     void CREATE(MemTableIn *in_m);  
  17.     void DEL(); 
  18.     LPSTR NEW();//分配一個unit 
  19.     LPSTR NEW_CONTINUEOUS(UINT n);//用於連續分配若干個unit 
  20.     UINT NEW(UINT n); //用於可碎片方式分配若干個unit 
  21.     LPSTR GET(UINT n);//用來獲得第n個分配的指針地址 
  22.     int get_totle_unitnum(); 
  23. public: 
  24.     MemTableIn in; 
  25.     LPSTR **pDouble_Indirect; 
  26.     LPSTR lpBitmap; 
  27.     LPSTR *pIndirect; 
  28.  
  29.     LPSTR m_lpFirstFree; 
  30.     int nFree[3];//0表示二級索引的自由,1表示1級索引的自由,2表示塊自由索引號 
  31.     INT32 m_EndBlkUseredUnits; 
  32.     int m_Vblkbytes; 
  33.     UINT m_UnitTotalNum; 
  34.     UINT m_log2Rindexs,m_log2Runits,m_log2Rbitmap,m_log2Lindexs,m_log2Lunits,m_log2Lbitmap; 
  35.     UINT m_log2UnitBytes; 
  36.     UINT m_index2ID,m_index1ID,m_UnitID; 
  37. }; 

.CPP內容如下: 

  1. /** 
  2. * ffs - Find the first set bit in an int 
  3. * @x: 
  4. * Description...用來統計一個整型數據的最高為1的位,後面有多少位。 
  5. *換個說法:從最高位開始找1,找到1後,看這個二進制數據1000....000是2的幾次方 
  6. * Returns: 
  7. */ 
  8. int ffs(int x) 
  9.     int r = 1; 
  10.  
  11.     if (!x) 
  12.         return 0; 
  13.     if (!(x & 0xffff)) { 
  14.         x >>= 16; 
  15.         r += 16; 
  16.     } 
  17.     if (!(x & 0xff)) { 
  18.         x >>= 8; 
  19.         r += 8; 
  20.     } 
  21.     if (!(x & 0xf)) { 
  22.         x >>= 4; 
  23.         r += 4; 
  24.     } 
  25.     if (!(x & 3)) { 
  26.         x >>= 2; 
  27.         r += 2; 
  28.     } 
  29.     if (!(x & 1)) { 
  30.         x >>= 1; 
  31.         r += 1; 
  32.     } 
  33.     return r; 
  34. LPSTR MemTree::GET(MemTreeHead *pHead,UINT n) 
  35.     int t; 
  36.     LPSTR lpt; 
  37.     int i,ii; 
  38.     //判斷是否直接存儲 
  39.     if(n<m.rootDirectUnitNum) 
  40.         return pHead->lpRootUnit + n*m.Vsizeof; 
  41.     else 
  42.         t=n-m.rootDirectUnitNum; 
  43.  
  44.     for(i=1;i<DEEP;i++) 
  45.     { 
  46.         if(t<TBT[i][0]) 
  47.             break; 
  48.         t-=TBT[i][0]; 
  49.     } 
  50.     //i便是深度,t是深度內的n 
  51.     lpt=pHead->pROOT_INDEX[i-1]; 
  52.     int D; 
  53.     for(ii=1;ii<i;ii++) 
  54.     { 
  55.         D=t /TBT[i][ii]; 
  56.         t=t % TBT[i][ii]; 
  57.         lpt=*(LPSTR*)(lpt+sizeof(LPSTR)*D); 
  58.     } 
  59.     return (lpt +   t*m.Vsizeof); 
  60.  
  61.  
  62. MemTable::MemTable(void) 
  63.  
  64. MemTable::~MemTable(void) 
  65.     //釋放所有空間 
  66.     for(int i=0;i<in.nIndexNum;i++) 
  67.     { 
  68.         LPSTR *pp=pDouble_Indirect[i]; 
  69.         if(pp==NULL) 
  70.             break; 
  71.         for(int ii=0;ii<in.nIndexNum;ii++) 
  72.         { 
  73.             LPSTR p=pp[ii]; 
  74.             if(p==NULL) 
  75.                 break; 
  76.             else 
  77.                 delete [] p; 
  78.         } 
  79.         delete [] pp; 
  80.     } 
  81.     delete [] pDouble_Indirect; 
  82. void MemTable::CREATE(MemTableIn *in_m) 
  83.     //1、初始化一些參考塊 
  84.     memset(&in,0,sizeof(in)); 
  85.     in=*in_m; 
  86.     m_UnitTotalNum=0; 
  87.     nFree[0]=nFree[1]=nFree[2]=0; 
  88.  
  89.     m_Vblkbytes= in.nUnitBytes *in.nUnitPerIndex; 
  90.     m_log2Runits=ffs(in.nUnitPerIndex)-1; 
  91.     m_log2Rindexs=ffs(in.nIndexNum)-1; 
  92.     m_log2UnitBytes=ffs(in.nUnitBytes)-1; 
  93.  
  94.     m_log2Lindexs=sizeof(UINT)*8-m_log2Rindexs; 
  95.     m_log2Lunits=sizeof(UINT)*8-m_log2Runits; 
  96.      
  97.  
  98.  
  99.     //2、初始化二級索引表 
  100.     pDouble_Indirect=new LPSTR* [in.nIndexNum]; 
  101.     memset(pDouble_Indirect,0,in.nIndexNum*sizeof(LPSTR)); 
  102.     nFree[0]=in.nIndexNum; 
  103. LPSTR MemTable::NEW() 
  104.     LPSTR lpReturn; 
  105.     if(nFree[2]==0)//直接塊用光了 
  106.     { 
  107.         if(nFree[1]==0) 
  108.         { 
  109.             if(nFree[0]==0) 
  110.                 return NULL;//寫日志:達到最大分配數量 
  111.  
  112.             pIndirect=pDouble_Indirect[in.nIndexNum - nFree[0]]=new LPSTR [in.nIndexNum]; 
  113.             memset(pIndirect,0,in.nIndexNum*sizeof(LPSTR)); 
  114.             nFree[1]=in.nIndexNum-1; 
  115.  
  116.             lpReturn=pIndirect[0]=new char[m_Vblkbytes]; 
  117.             memset(lpReturn,0,m_Vblkbytes); 
  118.             nFree[2]=in.nUnitPerIndex-1; 
  119.             m_lpFirstFree = lpReturn + in.nUnitBytes;    
  120.             nFree[0]--; 
  121.              
  122.         } 
  123.         else 
  124.         { 
  125.             lpReturn=pIndirect[in.nIndexNum - nFree[1]]=new char[m_Vblkbytes]; 
  126.             memset(lpReturn,0,m_Vblkbytes); 
  127.             nFree[1]--; 
  128.             nFree[2]=in.nUnitPerIndex-1; 
  129.             m_lpFirstFree = lpReturn + in.nUnitBytes; 
  130.         } 
  131.     } 
  132.     else 
  133.     { 
  134.         lpReturn=m_lpFirstFree; 
  135.         nFree[2]--; 
  136.         m_lpFirstFree += in.nUnitBytes; 
  137.     } 
  138.     m_UnitTotalNum++; 
  139.     return lpReturn; 
  140.  
  141. }//by:www.datahf.net zhangyu(zhangyu.blog.51cto.com) 
  142. UINT MemTable::NEW(UINT n) 
  143.     UINT nReturn=m_UnitTotalNum; 
  144.     for(int i=0;i<n;i++) 
  145.         NEW(); 
  146.     return nReturn; 
  147.  
  148. LPSTR MemTable::NEW_CONTINUEOUS(UINT n) 
  149.     LPSTR lpReturn; 
  150.     if(n>in.nUnitPerIndex) 
  151.         return NULL; 
  152.  
  153.     if(nFree[2]>=n) 
  154.     { 
  155.         nFree[2]-=n; 
  156.         lpReturn=m_lpFirstFree; 
  157.         m_UnitTotalNum+=n; 
  158.         m_lpFirstFree += (n*in.nUnitBytes); 
  159.     } 
  160.     else 
  161.     { 
  162.         m_UnitTotalNum+=nFree[2];//剩余空間保留、忽略 
  163.         nFree[2]=0; 
  164.         lpReturn=NEW(); 
  165.         nFree[2] -= (n-1); 
  166.         m_lpFirstFree += ((n-1)*in.nUnitBytes); 
  167.         m_UnitTotalNum += (n-1); 
  168.     } 
  169.     return lpReturn; 
  170. LPSTR MemTable::GET(UINT n) 
  171. { //by:www.datahf.net zhangyu(zhangyu.blog.51cto.com) 
  172.     if(n>=m_UnitTotalNum) 
  173.         return NULL;//寫日志:超過范圍 
  174.     m_UnitID=n<< m_log2Lunits >>m_log2Lunits; 
  175.     m_index1ID=n >> m_log2Runits; 
  176.     m_index2ID=m_index1ID >> m_log2Rindexs; 
  177.     m_index1ID=m_index1ID <<m_log2Lindexs >>m_log2Lindexs; 
  178.  
  179.     return (pDouble_Indirect[m_index2ID][m_index1ID] + (m_UnitID<<m_log2UnitBytes)); 
  180.  
  181. void MemTable::DEL() 
  182.  
  183.  

 

本文出自 “張宇(數據恢復)” 博客,請務必保留此出處http://zhangyu.blog.51cto.com/197148/680592

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved