zoukankan      html  css  js  c++  java
  • 简单内存池的实现

    说明

    操作系统维护malloc和free的基本原理是通过一个链表来记录的,每次malloc和free都有不小的开销,随着系统内存碎片化的加剧而开销增加,程序中可以通过申请一块大内存并自行分配的方式减少malloc和free操作,提供程序效率。提供一种简单内存池的方案供大家品鉴。

    设计思路

    1.已知单次需要分配内存size为length,内存池大小为N个length

    2. 设计维护内存池的数据结构

    3.初始化内存池

    4.单次申请内存

    5.释放内存

    PS:从过程来说,最关键的就是设计数据结构和初始化操作。

    实现方案

    采用STL的list维护内存池,初始化申请足够大的内存并将可用内存插入list ,单次申请即从list中取出一个内存块,释放内存将可用内存插入list中。实现如下

    #include<list>

    using namespace std; 

    struct node{ char* start; char* end; };

    list<node> mempool; 

    bool init(unsigned int length, unsigned int n)
    {
    node nodeinsert = {};
    char* mem = (char*)malloc(length*n);
    if (!mem)
    return false;
    for (int i = 0; i < n; i++)
    {
    nodeinsert.start = mem + i*length;
    nodeinsert.end = mem + (i + 1)*length - 1;
    mempool.push_back(nodeinsert);
    }
    }
    char* mempoolalloc()
    {
    char* ret = NULL;
    if (!mempool.empty())
    {
    ret = mempool.back().start;
    mempool.pop_back();
    }
    return ret;
    }
    void mempoolfree(char* start, char* end)
    {
    node nodeinsert;
    nodeinsert.start = start;
    nodeinsert.end = end;
    mempool.push_back(nodeinsert);
    }

      后记

    比较遗憾的是电脑没有装VISO,没有能够做一张简明点的图,须知文字总是难以完全表达意思。 

  • 相关阅读:
    leetcode 337. House Robber III
    leetcode 366 Find Leaves of Binary Tree
    leetcode 250 Count Univalue Subtrees
    leetcode 132 Palindrome Pairs 2
    leetcode 131 Palindrome Pairs
    leetcode 336 Palindrome Pairs
    leetcode 214 Shortest Palindrome
    leetcode 9 Palindrome Number
    Socket编程
    Zookeeper
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/3824128.html
Copyright © 2011-2022 走看看