Dav*_*idL 17 c memory-management
我想预先分配一定数量的内存,并将该内存用于程序的其余部分.该程序基本上将为一些字符串和结构分配内存.我该如何实现?用于存储指针的数据结构是什么以及如何使用它来为我提供特定数量的数据?
例如,如果我malloc 1 MB的空间并将其放在指针中p,我该如何从中创建一个250 KB的片段?
这只是一个快速而肮脏的实现.
pad*_*ddy 17
如果您希望能够将内存返回池中,则会变得更加复杂.但是,对于快速且不那么脏的方法,您可能希望实现一些可以再次使用的代码...
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;
}
Run Code Online (Sandbox Code Playgroud)
根据我的经验,当使用这样的池来分配许多对象时,我想预先确定需要多少内存,这样我就不会浪费,但我也不想犯任何错误(比如不分配enoudh).所以我将所有分配代码放在循环中,并设置我的池分配函数以接受在空池上执行"虚拟"分配的标志.第二次围绕循环,我已经计算了池的大小,所以我可以创建池并使用相同的函数调用进行实际分配,并且没有重复的代码.您需要更改我建议的池代码,因为如果尚未分配内存,则无法使用指针算法执行此操作.