欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

实现一个内存池管理的类方法

时间:2021-01-29 09:29:20|栏目: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语言生成简单格式的xml

栏    目:C代码

下一篇:C++ 压缩文件及文件夹方法 使用zlib开源库

本文标题:实现一个内存池管理的类方法

本文地址:http://www.codeinn.net/misctech/53030.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有