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

模拟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;      };

以上这篇实现一个内存池管理的类方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

—-想了解实现一个内存池管理的类方法分享!全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/481985.html

(0)
上一篇 2020年11月9日
下一篇 2020年11月9日

精彩推荐