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

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

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

(0)

相关推荐

  • 详解Nginx中基本的内存池初始化配置

    ngx_cycle 的初始化 整个初始化过程中,最重要的就是全局变量 nginx_cycle 的初始化,很多变量都是在这个过程中初始化的 nginx_cycle 又是通过两个局部变量 init_cycle 和 cycle 实现初始化的 事实上,日志初始化也可以算是对 nginx_cyle 的初始化,因为在代码中接下来马上要发生的就是一个赋值 ngx_memzero(&init_cycle, sizeof(ngx_cycle_t)); init_cycle.log = log; ngx_cycle

  • 基于一个简单定长内存池的实现方法详解

    主要分为 3 个部分,memoryPool 是管理内存池类,block 表示内存块,chunk 表示每个存储小块.它们之间的关系为,memoryPool 中有一个指针指向某一起始 block,block 之前通过 next 指针构成链表结构的连接,每个 block 包含指定数量的 chunk.每次分配内存的时候,分配 chunk 中的数据地址. 主要数据结构设计: Block: 复制代码 代码如下: struct block {    block * next;//指向下一个block指针   

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

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

  • C++高并发内存池的整体设计和实现思路

    目录 一.整体设计 1.需求分析 2.总体设计思路 3.申请内存流程图 二.详细设计 1.各个模块内部结构详细剖析 2.设计细节 三.测试 一.整体设计 1.需求分析 池化技术是计算机中的一种设计模式,内存池是常见的池化技术之一,它能够有效的提高内存的申请和释放效率以及内存碎片等问题,但是传统的内存池也存在一定的缺陷,高并发内存池相对于普通的内存池它有自己的独特之处,解决了传统内存池存在的一些问题. 附:实现一个内存池管理的类方法 1)直接使用new/delete.malloc/free存在的问

  • C++内存管理之简易内存池的实现

    目录 什么是内存池? 它的实现过程为: 初步实现 使用嵌入指针改进 更简化:static allocator macor for static allocator 什么是内存池? 频繁的调用 malloc 会影响运行效率以及产生额外的 cookie, 而内存池的思想是预先申请一大块内存,当有内存申请需求时,从内存池中取出一块内存分配给目标对象. 它的实现过程为: 预先申请 chunk 大小的内存池, 将内存池划按照对象大小划分成多个内存块.以链表的形式,即通过指针将内存块相连,头指针指向第一个空

  • C++内存池的简单实现

    目录 一.内存池基础知识 1.什么是内存池 1.1 池化技术 1.2 内存池 2.内存池的作用 2.1 效率问题 2.2 内存碎片 3.内存池技术的演进 二.简易内存池原理 1.整体设计 1.1 内存池结构 1.2 申请内存 1.3 释放内存 2.详细剖析 2.1 blockNode结构 2.2 单个对象的大小 3.性能比较 三.简易内存池完整源码 一.内存池基础知识 1.什么是内存池 1.1 池化技术 池化技术是计算机中的一种设计模式,主要是指:将程序中经常要使用的计算机资源预先申请出来,由程

  • C++高并发内存池的实现

    目录 项目介绍 内存池介绍 定长内存池的实现 高并发内存池整体框架设计 threadcache threadcache整体设计 threadcache哈希桶映射对齐规则 threadcacheTLS无锁访问 centralcache centralcache整体设计 centralcache结构设计 centralcache核心实现 pagecache pagecache整体设计 pagecache中获取Span 申请内存过程联调 threadcache回收内存 centralcache回收内存

  • C++内存池两种方案解析

    目录 C++内存池 1.C++内存池分析 2.多此一举方案 3.分时复用改进方案 4.其他的思考 C++内存池 前言: 使用new expression为类的多个实例分配动态内存时,cookie导致内存利用率可能不高,此时我们通过实现类的内存池来降低overhead.从不成熟到巧妙优化的内存池,得益于union的分时复用特性,内存利用率得到了提高. 1.C++内存池分析 在实例化某个类的对象时(在heap而不是stack中),若不使用array new,则每次实例化时都要调用一次内存分配函数,类

  • C++设计一个简单内存池的全过程

    什么是内存池??? 通常我们用new或malloc来分配内存的话,由于申请的大小不确定,所以当频繁的使用时会造成内存碎片和效率的降低.为了克服这种问题我们提出了内存池的概念.内存池是一种内存分配方式.内存池的优点就是可以有效的减少内存碎片化,分配内存更快速,减少内存泄漏等优点. 内存池是在真正使用内存之前,先申请分配一个大的内存块留作备用.当真正需要使用内存的时候,就从内存池中分配一块内存使用,当使这块用完了之后再还给内存池.若是内存块不够了就向内存再申请一块大的内存块. 可以看出这样做有两个好

  • Java代码构建一个线程池

    在现代的操作系统中,有一个很重要的概念――线程,几乎所有目前流行的操作系统都支持线程,线程来源于操作系统中进程的概念,进程有自己的虚拟地址空间以及正文段.数据段及堆栈,而且各自占有不同的系统资源(例如文件.环境变量等等).与此不同,线程不能单独存在,它依附于进程,只能由进程派生.如果一个进程派生出了两个线程,那这两个线程共享此进程的全局变量和代码段,但每个线程各拥有各自的堆栈,因此它们拥有各自的局部变量,线程在UNIX系统中还被进一步分为用户级线程(由进程自已来管理)和系统级线程(由操作系统的调

随机推荐