栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

模拟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;inext = 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;jnext;
     break;    
    }   
  }
  if(j>= m_memory.size())
  {
    for(int j=0;jnext = 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 m_memory; 
   };

以上这篇实现一个内存池管理的类方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/63892.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号