gpt4 book ai didi

c - 实现自己的内存池

转载 作者:太空狗 更新时间:2023-10-29 16:31:05 33 4
gpt4 key购买 nike

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

例如,如果我 malloc 1 MB 的空间并将它放在指针 p 中,我如何从中分出 250 KB 的一 block ?

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

最佳答案

如果您希望能够将内存返回到池中,事情会变得更加复杂。但是,对于快速且不太脏的方法,您可能希望实现一些可以再次使用的代码...

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;
}

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

关于c - 实现自己的内存池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11749386/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com