程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 完成一個內存池管理的類辦法

完成一個內存池管理的類辦法

編輯:關於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; 
   };

以上這篇完成一個內存池管理的類辦法就是分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved