码迷,mamicode.com
首页 > 其他好文 > 详细

实现一个内存池管理的类

时间:2015-04-16 21:55:13      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:c++   管理   内存管理   

模拟STL中的freelist,有这个思想在内。

union obj
{
  union obj* next;
  char p[1];     
};

class MemoryPool
{ 
     public:
            MemoryPool()
            {
               union obj* temp;
               m_memory.assign(5,(union obj*)NULL);         
               for(int i=0;i<m_memory.size();i++)
               {
                   for(int j=0;j<m_memory.size();j++)
                   {
                     temp = (obj*)malloc(sizeof(char)*(1<<(i+3)));     
                     temp->next = m_memory[i];
                     m_memory[i] = temp; 
                   }
               }
            }
            char* mem_get(int size)
            {
               int j;
               if( size > 128)
               {
                  char* start = (char*)malloc(sizeof(char)*size);
                  return start; 
               }
               int index = freelist_index(size);
               obj* temp = m_memory[index];
               if(temp == NULL)  //
               {
                  for(j = index+1;j<m_memory.size();j++)
                  {
                     temp = m_memory[j];
                     if(temp != NULL)
                     {
                       m_memory[j] = temp->next;
                       break;       
                     }     
                  }
                  if(j>= m_memory.size())
                  {
                     for(int j=0;j<m_memory.size();j++)
                    {
                      temp = (obj*)malloc(sizeof(char)*(1<<(index+3)));     
                      temp->next = m_memory[index];
                      m_memory[index] = temp; 
                    }  
                    temp = m_memory[index];
                    m_memory[index] = temp->next;
                    return (char*)temp;
                  }
                  else
                  {
                     obj* cur;
                    
                     int up_size = round_up(size);
                     for(int i=0;i<(1<<(j-index));i++)
                     {
                        cur =  temp;
                        cur->next = m_memory[index];
                        m_memory[index] = cur;
                        temp = cur+up_size;
                  
                     } 
                     temp = m_memory[index];
                     m_memory[index] = temp->next;
                     return (char*)temp;
                  }     
               }
               else
               { 
                  m_memory[index] = temp->next;
                  return (char*)temp; 
               }
            }
            void mem_free(void* p,int size)
            {
              if(size > 128)
              {
                free(p);
                return ;   
              }   
              obj* temp = (obj*)p;
              int index = freelist_index(size);
              temp->next = m_memory[index];
              m_memory[index]  = temp;
            }
     private:
             enum {_ALIGN = 8};//
             int freelist_index(int __bytes) 
             {
                 return (((__bytes) + (int)_ALIGN-1)/(size_t)_ALIGN - 1);
             }
             int round_up(int __bytes) 
             { 
               return (((__bytes) + (int) _ALIGN-1) & ~((int) _ALIGN - 1)); 
             }
             vector<union obj*> m_memory; 
      };


实现一个内存池管理的类

标签:c++   管理   内存管理   

原文地址:http://blog.csdn.net/yusiguyuan/article/details/45081031

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!