我想预先分配一定量的内存,并将其用于程序的其余部分.该程序将基本上为几个字符串和结构体分配内存.如何实现?什么数据结构用于存储指针,如何使用它来给我一个特定的金额?
例如,如果我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).所以我把所有的分配代码放在一个循环中,并设置我的池分配函数来接受一个在空的池上执行“虚拟”分配的标志.第二次循环,我已经计算了池的大小,所以我可以创建池,并使用相同的函数调用和没有重复的代码进行真正的分配.您需要更改建议的池代码,因为如果内存未分配,则无法使用指针算术.