/**
* 转载请注明出处, 由于个人技术能力有限, 英语水平欠缺,
* 有翻译不合适或错误的地方, 请纠正,
* 希望不要因为我的错误误导您, 希望您的智慧可以加入.
* @translator: selfimpr
* @mail: lgg860911@yahoo.com.cn
* @blog: http://blog.csdn.net/lgg201
*/
内存池 API
typedef struct {// 内存池元素
void *ptr; // 指针
void (*del)(void *); // 删除函数
} TCMPELEM;
typedef struct { // 内存池对象
void *mutex; // 互斥对象 , 用于锁
TCMPELEM *elems; // 内存池元素数组
int anum; // 内存池元素数组大小
int num; // 已被使用的内存池大小
} TCMPOOL;
TCMPOOL *tcmpoolnew();
初始化创建一个内存池 , 默认创建的内存池容量为 128
void tcmpooldel(TCMPOOL *mpool);
遍历所有的内存池元素 , 并逐个调用创建时他们自己定义的 del 方法
void tcmpoolpush(TCMPOOL *mpool, void *ptr, void (*del)(void *));
向内存池中放入一个元素 , ptr 是要存放的内容 , del 是释放该元素时使用的函数 . 返回 ptr
void *tcmpoolpushptr(TCMPOOL *mpool, void *ptr);
当要放入的元素的内容可以用 free 进行释放的时候 , 使用此函数 , 内部的调用如下 : tcmpoolpush(mpool, ptr, (void (*)(void *))free), 可以看出是对 free 做了强制类型转换然后作为参数
TCXSTR *tcmpoolpushxstr(TCMPOOL *mpool, TCXSTR *xstr);
向内存池中插入一个可扩充字符串 TCXSTR, 与 tcmpoolpushptr 同理 , 不过这里传入的释放函数是 tcxstrdel
TCLIST *tcmpoolpushlist(TCMPOOL *mpool, TCLIST *list);
向内存池中插入一个列表对象 , 与 tcmpoolpushptr 同理 , 不过这里传入的释放函数是 tclistdel
TCMAP *tcmpoolpushmap(TCMPOOL *mpool, TCMAP *map);
同上 , 这里的释放函数是 tcmapdel
TCTREE *tcmpoolpushtree(TCMPOOL *mpool, TCTREE *tree);
同上 , 这里的释放函数是 tctreedel
void *tcmpoolmalloc(TCMPOOL *mpool, size_t size);
向指定的内存池中申请 size 大小的内存空间 , 内部是调用 TCMALLOC 分配空间 , 并放入了内存池的管理
TCXSTR *tcmpoolxstrnew(TCMPOOL *mpool);
创建一个可扩展字符串对象 (TCXSTR), 然后加入到内存池管理
TCLIST *tcmpoollistnew(TCMPOOL *mpool);
创建一个列表对象 , 然后加入到内存池管理
TCMAP *tcmpoolmapnew(TCMPOOL *mpool);
创建一个 TCMAP 对象 , 然后加入到内存池管理
TCTREE *tcmpooltreenew(TCMPOOL *mpool);
创建一个 TCTREE 对象 , 然后加入到内存池管理
void tcmpoolpop(TCMPOOL *mpool, bool exe);
把内存池中的最后一个元素弹出 , exe 是指定是否执行该元素的析构函数 ( 就是传入的 del)
void tcmpoolclear(TCMPOOL *mpool, bool exe);
把内存池置空 , exe 用来指定是否为每个元素执行析构函数 .
对于 tcmpoolpop 和 tcmpoolclear 函数而言 , 其实内部并没有做真正的移除操作 , 而是改变内存池的 num 属性 , 这样不仅达到了对内存池的管理 , 而且由于没有实际的操作 , 达到了效率的提升
TCMPOOL *tcmpoolglobal();
用来获取一个全局的内存池对象 , 如果目前没有全局内存池对象 , 则创建一个 , 并在创建完之后 , 通过 atexit() 函数注册了一个终止函数 tcmpooldelglobal, 在这个终止函数里对全局内存池对象做了销毁操作 ( 没有对内存池中的对象进行销毁 )