54 Star 544 Fork 211

balloonwj / CppGuide

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
08内存池.md 1.62 KB
一键复制 编辑 原始数据 按行查看 历史
zhangyuanlong 提交于 2020-10-08 15:33 . add articles

Memcached源码阅读八 内存池

Memcached内部维护了一个内存池来减少频繁的mallocfree,在该内存池的基础上面实现了slab内存管理,下面简单介绍下内存池的实现,大家在实现类似结构时,可以做个参考。

static void *mem_base = NULL;//mem_base指向新申请的内存空间,指向整个内存空间的头部
static void *mem_current = NULL;//指向已经分配过的空间,且指向已经分配了空间的尾部
static size_t mem_avail = 0;//剩余空间大小

//部分初始化操作
mem_limit = limit;//初始容量
mem_base = malloc(mem_limit);//申请内存空间

if (mem_base != NULL) //如果不为空
{   
      mem_current = mem_base;
      //当前还没分配,所以其指向为整个空间
      mem_avail = mem_limit;
      //可用空间为满
} else {
       fprintf(stderr, "Warning: Failed to allocate requested memory in"
                    " one large chunk.\nWill allocate in smaller chunks\n");
}

//分配空间的过程,分配size大小的空间
static void *memory_allocate(size_t size) {
    void *ret;

    //如果未初始化
    if (mem_base == NULL) {
        ret = malloc(size);
    } else {
        ret = mem_current;

        if (size > mem_avail) {
            return NULL;
        }

        //执行对齐操作
        if (size % CHUNK_ALIGN_BYTES) {
            size += CHUNK_ALIGN_BYTES - (size % CHUNK_ALIGN_BYTES);
        }

        mem_current = ((char*)mem_current) + size;
        if (size < mem_avail) {
            mem_avail -= size;
        } else {
            mem_avail = 0;
        }
    }

    return ret;
}
C++
1
https://gitee.com/balloonwj/CppGuide.git
git@gitee.com:balloonwj/CppGuide.git
balloonwj
CppGuide
CppGuide
master

搜索帮助