一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

適用于類和結(jié)構(gòu)體的內(nèi)存池模板類

 紫火神兵 2015-06-25
   原理很簡單,就是先開辟n個數(shù)據(jù)塊,每個數(shù)據(jù)塊的前四個字節(jié)next_id表示下一個可用的數(shù)據(jù)塊的編號。該內(nèi)存池類中有一個成員m_firstId, 表示第一個可用的數(shù)據(jù)塊的編號,然后在申請內(nèi)存的時候,根據(jù)這個編號,返回對應(yīng)的數(shù)據(jù)塊的地址。在將申請的內(nèi)存塊A歸還給內(nèi)存池時,根據(jù)其地址確定其所在的內(nèi)存塊編號。然后將該內(nèi)存塊的next_id改為m_firstId,將m_firstId改為該內(nèi)存塊的id。
Mempool.h
  1. #ifndef _MEM_POOL_H_
  2. #define _MEM_POOL_H_

  3. #include "Lock.hpp"

  4. template<class T>
  5. class Mempool
  6. {
  7. public:
  8.     struct BlockNode
  9.     {
  10.         int        next_id;
  11.         T          data;
  12.     };

  13. public:
  14.     Mempool(int nCount)
  15.         :m_nCount(nCount)
  16.         ,m_firstId(-1)
  17.         ,m_NodeHead(NULL)
  18.         ,m_pNode(NULL)
  19.     {
  20.         m_NodeHead = (BlockNode*)malloc(sizeof(BlockNode) * m_nCount);
  21.         if(m_NodeHead == NULL)
  22.         {
  23.             return;
  24.         }

  25.         memset(m_NodeHead, 0, sizeof(BlockNode) * m_nCount);

  26.         m_pNode = new BlockNode*[m_nCount];

  27.         memset(m_pNode, 0, sizeof(BlockNode*) * m_nCount);

  28.         BlockNode* temp = m_NodeHead;

  29.         for(int i = 0; i < m_nCount; ++i)
  30.         {
  31.             m_pNode[i] = temp;
  32.             temp->next_id = i + 1;
  33.             temp = (BlockNode*)((char*)temp + sizeof(BlockNode));

  34.             if(i == m_nCount - 1)
  35.             {
  36.                 temp->next_id = -1;
  37.             }
  38.         }

  39.         m_firstId = 0;
  40.     }

  41.     ~Mempool()
  42.     {
  43.         if(m_NodeHead)
  44.         {
  45.             free(m_NodeHead);
  46.             m_NodeHead = NULL;
  47.         }

  48.         if(m_pNode)
  49.         {
  50.             delete []m_pNode;
  51.             m_pNode = NULL;
  52.         }
  53.     }

  54.     inline void* mallocMemBuf()
  55.     {
  56.         AutoLock lock(&m_lock);

  57.         void* p = NULL;
  58.         if(m_firstId != -1 && m_firstId < m_nCount)
  59.         {
  60.             p = (void*)&(m_pNode[m_firstId]->data);
  61.             m_firstId = m_pNode[m_firstId]->next_id;
  62.         }
  63.         else
  64.         {
  65.             p = malloc(sizeof(T));
  66.         }

  67.         return p;
  68.     }

  69.     inline void freeMemBuf(void* pNode)
  70.     {
  71.         AutoLock lock(&m_lock);

  72.         if((pNode >= (char*)m_NodeHead) && (pNode <= (char*)m_NodeHead + sizeof(BlockNode)* m_nCount))
  73.         {
  74.             for(int i = 0; i < m_nCount; ++i)
  75.             {
  76.                 if(pNode == (void*)&(m_pNode[i]->data))
  77.                 {
  78.                     m_pNode[i]->next_id = m_firstId;
  79.                     m_firstId = i;
  80.                     return;
  81.                 }
  82.             }
  83.         }

  84.         free(pNode);
  85.     }

  86. private:
  87.     int                m_nCount;            //the block count
  88.     int                m_firstId;            //the first free block id
  89.     BlockNode*         m_NodeHead;            //the head of the list
  90.     BlockNode**        m_pNode;            //the pointer array
  91.     Lock               m_lock;    
  92. };

  93. #endif
運用實例
  1. #include <iostream>
  2. #include <time.h>
  3. #include "Mempool.hpp"

  4. using namespace std;

  5. #define _MEM_POOL_

  6. class Test
  7. {
  8. public:
  9.     Test()
  10.         :a(0)
  11.         ,b(0)
  12.     {
  13.         count1++;
  14.         //cout << "Test constructor!" << endl;
  15.     }

  16.     ~Test()
  17.     {
  18.         count2++;
  19.         //cout << "Test destructor!" << endl;
  20.     }

  21.     void setA(int _a)
  22.     {
  23.         a = _a;
  24.     }

  25.     void setB(int _b)
  26.     {
  27.         b = _b;
  28.     }

  29.     void show()
  30.     {
  31.         cout << "a = " << a << " b = " << b << endl;
  32.     }

  33. #ifdef _MEM_POOL_

  34.     inline void* operator new(unsigned int nSize )
  35.     {
  36.         if( mempool == NULL )
  37.         {
  38.             return malloc( nSize );
  39.         }
  40.         return mempool->mallocMemBuf( );
  41.     };
  42.     inline void operator delete(void* p)
  43.     {
  44.         if( mempool == NULL )
  45.         {
  46.             free( p );
  47.         }
  48.         else
  49.         {
  50.             mempool->freeMemBuf( p );
  51.         }
  52.     };

  53.     static Mempool<Test> *mempool;

  54. #endif

  55.     static int count1;
  56.     static int count2;
  57.     

  58. private:
  59.     int a;
  60.     int b;
  61.     char data[2048];
  62. };

  63. int Test::count1 = 0;
  64. int Test::count2 = 0;
  65. #ifdef _MEM_POOL_
  66. Mempool<Test>* Test::mempool = NULL;
  67. #endif

  68. int main()
  69. {
  70. #ifdef _MEM_POOL_
  71.     Test::mempool = new Mempool<Test>(5);
  72. #endif

  73.     clock_t start, end;
  74.     double duration;

  75.     start = clock();

  76.     for(int i = 0 ; i < 10000000; ++i)
  77.     {
  78.         Test *t = new Test;
  79.         //t->show();
  80.         delete t;
  81.     }

  82.     //cout << "count1 = " << Test::count1 << " count2 = " << Test::count2 << endl;

  83.     end = clock();

  84.     duration = double(end - start) / CLOCKS_PER_SEC;

  85.     cout << "total used " << duration << "s" << endl;

  86.     system("pause");

  87.     return 0;

  88. }

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日韩欧美一区二区不卡视频| 欧美日韩国产免费看黄片| 国产日韩精品激情在线观看| 国产精品不卡一区二区三区四区 | 中国黄色色片色哟哟哟哟哟哟| 中字幕一区二区三区久久蜜桃| 亚洲免费视频中文字幕在线观看 | 成人午夜爽爽爽免费视频| 午夜色午夜视频之日本| 亚洲少妇一区二区三区懂色| 91人妻丝袜一区二区三区| 人妻少妇av中文字幕乱码高清| 国产精品视频一区二区秋霞 | 欧美日韩有码一二三区| 欧美成人欧美一级乱黄| 亚洲国产av在线观看一区| 台湾综合熟女一区二区| 国产一级精品色特级色国产| 91插插插外国一区二区婷婷| 99热九九在线中文字幕| 在线九月婷婷丁香伊人| 国产精品久久精品国产| 国产一区二区在线免费| 欧美黑人黄色一区二区| 老司机精品一区二区三区| 精品少妇人妻av一区二区蜜桃| 好骚国产99在线中文| 亚洲中文字幕在线乱码av| 欧美中文字幕一区在线| 欧美胖熟妇一区二区三区| 一区二区日韩欧美精品| 日韩特级黄片免费观看| 儿媳妇的诱惑中文字幕| 99久久精品免费看国产高清| 激情中文字幕在线观看| 亚洲成人免费天堂诱惑| 日本理论片午夜在线观看| 亚洲欧美日韩熟女第一页| 久久碰国产一区二区三区| 九九热视频经典在线观看| 欧美日本精品视频在线观看|