c – 实现自己的内存池

我想预先分配一定量的内存,并将其用于程序的其余部分.该程序将基本上为几个字符串和结构体分配内存.如何实现?什么数据结构用于存储指针,如何使用它来给我一个特定的金额?

例如,如果我malloc 1 MB的空间,并在一个指针p,我如何从它刻出一个250 KB的一块?

这只是一个快速而肮脏的实现.

解决方法

如果您想要将内存返回到池中,则会变得更加复杂.但是,对于快速而不太肮脏的方法,您可能希望实现一些可以再次使用的代码
typedef struct pool
{
  char * next;
  char * end;
} POOL;

POOL * pool_create( size_t size ) {
    POOL * p = (POOL*)malloc( size + sizeof(POOL) );
    p->next = (char*)&p[1];
    p->end = p->next + size;
    return p;
}

void pool_destroy( POOL *p ) {
    free(p);
}

size_t pool_available( POOL *p ) {
    return p->end - p->next;
}

void * pool_alloc( POOL *p,size_t size ) {
    if( pool_available(p) < size ) return NULL;
    void *mem = (void*)p->next;
    p->next += size;
    return mem;
}

根据我的经验,当使用这样的池来分配很多对象时,我想预先计算需要多少内存,这样我不会浪费,但是我也不想犯错误(比如不分配enoudh).所以我把所有的分配代码放在一个循环中,并设置我的池分配函数来接受一个在空的池上执行“虚拟”分配的标志.第二次循环,我已经计算了池的大小,所以我可以创建池,并使用相同的函数调用和没有重复的代码进行真正的分配.您需要更改建议的池代码,因为如果内存未分配,则无法使用指针算术.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...