微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/c/112384.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐