加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 实现自己的内存池

发布时间:2020-12-16 03:10:59 所属栏目:百科 来源:网络整理
导读:我想预先分配一定量的内存,并将其用于程序的其余部分.该程序将基本上为几个字符串和结构体分配内存.如何实现?什么数据结构用于存储指针,如何使用它来给我一个特定的金额? 例如,如果我malloc 1 MB的空间,并在一个指针p,我如何从它刻出一个250 KB的一块? 这
我想预先分配一定量的内存,并将其用于程序的其余部分.该程序将基本上为几个字符串和结构体分配内存.如何实现?什么数据结构用于存储指针,如何使用它来给我一个特定的金额?

例如,如果我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).所以我把所有的分配代码放在一个循环中,并设置我的池分配函数来接受一个在空的池上执行“虚拟”分配的标志.第二次循环,我已经计算了池的大小,所以我可以创建池,并使用相同的函数调用和没有重复的代码进行真正的分配.您需要更改建议的池代码,因为如果内存未分配,则无法使用指针算术.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读