return NULL;
if (size) {
void *mem = calloc(1, size);
if (mem != NULL) {
pool->ptr = mem;
pool->size = size;
pool->used = 0;
return pool;
}
}
return NULL;
}
/* allocate memory from memory pool */
void* pool_alloc(struct pool_t* pool, size_t size) {
if(pool == NULL)
return NULL;
size_t avail_size = pool->size - pool->used;
if (size && size <= avail_size){
void *mem = pool->ptr + pool->used;
pool->used += size;
return mem;
}
return NULL;
}
/* release memory for whole pool */
void delete_pool(struct pool_t* pool) {
if (pool != NULL) {
free(pool->ptr);
free(pool);
}
}
内存池的实现涉及非常艰难的任务。可能一些现有的库能很好地满足你的需求:
GNU libc obstack
Samba talloc
Ravenbrook Memory Pool System
5) 数据结构
把数据存到正确的数据结构里,能解决很多内存管理问题。而数据结构的选择,大多取决于算法,这些算法访问数据、把数据保存到例如链表、哈希表或树中。按算法选择数据结构有额外的好处,例如能够遍历数据结构一次就能释放数据。因为标准库并未提供对数据结构的支持,这里列出几个支持数据结构的库:
For traditional Unix implementation of linked lists and trees see BSD’s queue.h and tree.h macros both are part of libbsd.
GNUlibavl
Glib Data Types
For additional list seehttp://adtinfo.org/index.html
6) 标记并清除垃圾收集器
处理内存问题的另一种方式,就是利用自动垃圾收集器的优势,自此从自己清除内存中解放出来。于引用计数中内存不再需要时清除机制相反,垃圾收集器在发生指定事件是被调用,如内存分配错误,或分配后超过了确切的阀值。标记清除算法是实现垃圾收集器的一种方式。此算法先为每个引用到分配内存的对象遍历堆,标记这些仍然可用的内存对象,然后清除未标记的内存对象。
可能C中最有名的类似垃圾收集器的实现是Boehm-Demers-Weiser conservative garbage collector。使用垃圾收集器的瑕疵可能是性能问题,或向程序引入非确定性的延缓。另一问题是,这可能导致库函数使用malloc,这些库函数申请的内存不受垃圾处理器监管,必须手动释放。
虽然实时环境无法接受不可预料的卡顿,仍有许多环境从中获取的好处远超过不足。从性能的角度看,甚至有性能提升。一些项目使用含有Mono项目GNU Objective C运行环境或Irssi IRC客户端的Boehm垃圾收集器。
持续更新中。
笔者是一个有着7年工作经验的架构师,对于c++,自己有做资料的整合,一个完整学习C语言c++的路线,学习资料和工具。可以进我的Q群7418,18652领取,免费送给大家。希望你也能凭自己的努力,成为下一个优秀的程序员!另外博主的微信公众号是:C语言编程学习基地,欢迎关注!
|