<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      內(nèi)存池的原理及實(shí)現(xiàn)

      在軟件開發(fā)中,有些對(duì)象使用非常頻繁,那么我們可以預(yù)先在堆中實(shí)例化一些對(duì)象,我們把維護(hù)這些對(duì)象的結(jié)構(gòu)叫“內(nèi)存池”。在需要用的時(shí)候,直接從內(nèi)存池中拿,而不用從新實(shí)例化,在要銷毀的時(shí)候,不是直接free/delete,而是返還給內(nèi)存池。

      把那些常用的對(duì)象存在內(nèi)存池中,就不用頻繁的分配/回收內(nèi)存,可以相對(duì)減少內(nèi)存碎片,更重要的是實(shí)例化這樣的對(duì)象更快,回收也更快。當(dāng)內(nèi)存池中的對(duì)象不夠用的時(shí)候就擴(kuò)容。

      我的內(nèi)存池實(shí)現(xiàn)如下:

      #pragma once
      #include <assert.h>
      
      template<typename T>
      struct ProxyT
      { 
          ProxyT():next(NULL){} 
          T data;
          ProxyT* next;
      };
      
      template<typename T>
      class MemoryPool
      {
      public:
          static void* New()
          {
              if(next==NULL)
              {
                  Alloc();
              }
              assert(next!=NULL);
              ProxyT<T>* cur=next;
              next=next->next;
              return cur;
          }
      
          static void Delete(void* ptr)
          {
              ProxyT<T>* cur=static_cast<ProxyT<T>*>(ptr);
              cur->next=next;
              next=cur; 
          }
      
      #ifdef CanFree
          static void Clear()
          {
              ProxyT<T>* proxy=NULL;
              while(next!=NULL)
              {
                  proxy=next->next;
                  delete next;
                  next=proxy->next;
              }
              next=NULL;
          }
      #endif
          
      private: 
          static void Alloc(size_t size=16)
          {
              if(next==NULL)
              {
              #ifdef CanFree
                  ProxyT<T>* tmpProxy=new ProxyT<T>();
                  next=tmpProxy;
                  for(int i=1;i<size;i++)
                  { 
                      tmpProxy->next=new ProxyT<T>();
                      tmpProxy=tmpProxy->next;
                  } 
              #else
                  ProxyT<T>* memory=(ProxyT<T>*)malloc(size*sizeof(ProxyT<T>));
                  ProxyT<T>* tmpProxy=new (memory) ProxyT<T>();
                  next=tmpProxy;
                  for (size_t i=1;i<size;i++)
                  {
                      tmpProxy->next=new (memory+i) ProxyT<T>();
                      tmpProxy=tmpProxy->next;
                  }
              #endif
      
              }
          }
       
          static ProxyT<T>* next; 
          MemoryPool<T>();
          MemoryPool<T>(const MemoryPool<T>&);
      };
      
      template<typename T> ProxyT<T>* MemoryPool<T>::next=NULL; 
      
      #define NewAndDelete(className)             \
      static void* operator new(size_t size)      \
      {                                           \
          return MemoryPool<className>::New();    \
      }                                           \
      static void operator delete(void* ptr)      \
      {                                           \
          MemoryPool<className>::Delete(ptr);     \
      }   

      測(cè)試代碼如下:

      #include "stdafx.h" 
      #define CanFree
      #include "MemoryPool.h"
       
      struct A
      { 
          int i; 
          NewAndDelete(A) 
      };
        
      int _tmain(int argc, _TCHAR* argv[])
      {   
           
          { 
              vector<A*> vect;
              for(int i=0;i<16;i++)
              {
                  A* a=new A();
                  a->i=i;
                  vect.push_back(a);
              }
              for(int i=0;i<vect.size();i++)
              {
                  cout<<vect[i]->i<<endl;
              }
              for(int i=vect.size()-1;i>=0;i--)
              {
                  delete vect[i];
              }
              vect.clear();
              
              MemoryPool<A>::Clear();
          }
         
          system("pause");
          return 0; 
      }


      運(yùn)行結(jié)果如下圖:

      不到100行代碼,有兩個(gè)public方法New和Delete;還有一個(gè)Clear方法,這個(gè)方法的存在取決于是否定義了宏CanFree,如果定義了這個(gè)宏,那么對(duì)象是一個(gè)個(gè)的實(shí)例化,在調(diào)用Clear的時(shí)候可以一個(gè)個(gè)的回收,如果沒有定義,那么是一次分配一塊較大的內(nèi)存,然后在這塊內(nèi)存上實(shí)例化多個(gè)對(duì)象,但沒有實(shí)現(xiàn)回收這塊內(nèi)存的方法,如果要回收這樣的大塊內(nèi)存塊,就必須將這些內(nèi)存塊的首地址存起來(lái),我這里沒有存起來(lái),而且還要標(biāo)記對(duì)象是否使用,那么Proxy<T>還要加一個(gè)字段表示是否使用,在回收的時(shí)候還要判斷所有對(duì)象是否沒有使用,只有都沒使用才能回收,妹的,為了回收弄得這么麻煩,話說(shuō)你為什么要回收內(nèi)存池呢,于是就沒有實(shí)現(xiàn)回收的方法。整個(gè)內(nèi)存池其實(shí)就是一個(gè)單鏈表,表頭指向第一個(gè)沒有使用節(jié)點(diǎn),我們可以把這個(gè)單鏈表想象成一段鏈條,調(diào)用方法New就是從鏈條的一端(單鏈表表頭)取走一節(jié)點(diǎn),調(diào)用方法Delete就是在鏈條的一端(單鏈表表頭)前面插入一個(gè)節(jié)點(diǎn),新插入的節(jié)點(diǎn)就是鏈表的表頭,這樣New和Delete的時(shí)間復(fù)雜度都是O(1),那叫一個(gè)快。

      所有要使用內(nèi)存池的對(duì)象,只需要在這個(gè)對(duì)象中引入宏NewAndDelete,這個(gè)宏其實(shí)就是重寫對(duì)象的new和delete方法,讓對(duì)象的創(chuàng)建和回收都通過(guò)內(nèi)存池來(lái)實(shí)現(xiàn),所有用內(nèi)存池實(shí)現(xiàn)的對(duì)象使用起來(lái)和別的對(duì)象基本上是一樣,唯一的一個(gè)問(wèn)題就是內(nèi)存池對(duì)象對(duì)象不是線程安全的,在多線程編程中,創(chuàng)建一個(gè)對(duì)象時(shí)必須枷鎖。如果在New和Delete的實(shí)現(xiàn)中都加個(gè)鎖,我又覺得他太影響性能,畢竟很多時(shí)候是不需要枷鎖,有些對(duì)象可能有不用于多線程,對(duì)于這個(gè)問(wèn)題,求高手指點(diǎn)!

       

      posted @ 2013-10-28 08:33  古文觀芷  閱讀(8530)  評(píng)論(5)    收藏  舉報(bào)
      主站蜘蛛池模板: 免费无码黄网站在线观看| 亚洲中文字幕国产综合| 国产在线亚州精品内射| 汶上县| 九九热视频在线精品18| 国产精品国产三级国快看| 亚洲人成电影网站色| 日韩美av一区二区三区| 久久av无码精品人妻出轨| 亚洲成在人线在线播放无码| 亚洲欧美国产免费综合视频| 色爱av综合网国产精品| 无码国内精品久久人妻蜜桃| 人人色在线视频播放| 综合色久七七综合尤物| 少妇无码一区二区三区免费| 色一情一乱一区二区三区码| 人人人澡人人肉久久精品| 盘锦市| 伊人精品成人久久综合97| 免费看黄片一区二区三区| AV无码不卡一区二区三区| 国产69精品久久久久人妻刘玥| 熟女女同亚洲女同中文字幕| 国产精品自拍午夜福利| 国产网友愉拍精品视频手机| 狠狠综合久久av一区二| 国产微拍一区二区三区四区| 午夜精品区| 国产sm调教折磨视频| 免费看的日韩精品黄色片| 狠狠躁日日躁夜夜躁欧美老妇 | 麻豆精品久久精品色综合| 宝清县| 四虎影视一区二区精品| 国产亚洲欧美精品久久久| 亚洲色欲色欲天天天www| 中日韩黄色基地一二三区| 亚洲日韩久久综合中文字幕| 国产极品视频一区二区三区| 2019亚洲午夜无码天堂|