设为首页 加入收藏

TOP

C语言进阶指南(1)丨整型溢出和类型提升、内存申请和管理(四)
2019-04-04 16:08:37 】 浏览:345
Tags:语言 进阶 指南 溢出 类型 提升 内存 申请 管理
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语言编程学习基地,欢迎关注!

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇数据结构——线性表的顺序存储结构 下一篇C语言编程笔记丨位反转的最佳算法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目