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

    #include "common.h"
    #include "pool.h"
    #include <assert.h>
    
    static inline void *objmem_to_obj(void *objmem)
    {
    return objmem + sizeof(pool_obj_head_t);
    }
    
    static inline void *obj_to_objmem(void *obj)
    {
    return obj - sizeof(pool_obj_head_t);
    }
    
    static inline void *idx_to_objmem(pool_t * p, pool_size_t idx)
    {
    return p->obj + idx * (p->objmemsize);
    }
    
    static inline pool_size_t objmem_to_idx(pool_t * p, void *obj)
    {
    return (obj - p->obj) / (p->objmemsize);
    }
    
    pool_t *pool_create(pool_obj_size_t objsize, pool_size_t poolsize)
    {
    
    pool_size_t i;
    pool_obj_head_t *head;
    
    pool_t *p;
    
    size_t manage_mem_size = (sizeof(pool_t));
    size_t free_list_mem_size = (poolsize * sizeof(pool_size_t));
    size_t obj_mem_size = (objsize + sizeof(pool_obj_head_t)) * poolsize;
    
    p = calloc(manage_mem_size + free_list_mem_size + obj_mem_size, 1);
    
    if (!p)
    return NULL;
    
    p->num = poolsize;
    p->objsize = objsize;
    p->objmemsize = obj_mem_size / poolsize;
    p->freeobj = (void *)p->buffer;
    p->obj = p->buffer + free_list_mem_size;
    
    /* init free list */
    p->free_idx = 0;
    for (i = 0; i < p->num; i++) {
    p->freeobj[i] = i + 1;
    }
    
    /* init obj head */
    for (i = 0; i < p->num; i++) {
    head = (pool_obj_head_t *) (idx_to_objmem(p, i));
    head->p = p;
    }
    return p;
    }
    
    void *pool_alloc_obj(pool_t * p)
    {
    pool_size_t idx;
    void *obj;
    
    if (unlikely(p->free_idx == p->num)) {
    return NULL;    /* empty */
    }
    
    idx = p->free_idx;
    p->free_idx = p->freeobj[idx];
    
    obj = idx_to_objmem(p, idx);
    
    return objmem_to_obj(obj);
    }
    
    void pool_free_obj(pool_t * p, void *obj)
    {
    
    pool_size_t idx;
    pool_obj_head_t *head;
    
    head = (pool_obj_head_t *) obj_to_objmem(obj);
    
    assert(head->p == p);
    
    idx = objmem_to_idx(p, obj);
    
    /* insert to list head, hot cache */
    p->freeobj[idx] = p->free_idx;
    p->free_idx = idx;
    }
    
    
    void pool_destory(pool_t * p)
    {
    free(p);
    }
    #ifndef POOL_HHH
    #define POOL_HHH
    
    #include "common.h"
    
    /* simple and fast obj pool without multi-thread support */
    
    typedef uint32_t pool_size_t;
    typedef uint32_t pool_obj_size_t;
    
    typedef struct pool {
    
        pool_obj_size_t objsize;
        pool_obj_size_t objmemsize;
    
        pool_size_t num;
    
        pool_size_t free_idx;    /* free list implemented by array */
        pool_size_t *freeobj;    /* free list array */
    
        void *obj;        /* obj array */
        char buffer[0];
    } pool_t;
    
    typedef struct pool_obj_head {
        pool_t *p;
    
    } pool_obj_head_t;
    
    pool_t *pool_create(pool_obj_size_t objsize, pool_size_t poolsize);
    
    void *pool_alloc_obj(pool_t * p);
    
    void pool_free_obj(pool_t * p, void *obj);
    
    void pool_destory(pool_t * p);
    
    #endif
  • 相关阅读:
    Python环境的安装
    tar.xz如何解压:linux和windows下tar.xz解压命令介绍
    设置SVN忽略文件和目录(文件夹)
    C#【Thread】Interlocked 轻量级锁
    手把手教你做个AR涂涂乐
    理解UV贴图
    unity animation readonly 无法加事件?
    LUA Metatables
    增强现实阴影
    unity shader tags
  • 原文地址:https://www.cnblogs.com/unixshell/p/3807386.html
Copyright © 2011-2022 走看看