メモリをプールに戻せるようにしたい場合は、さらに複雑になります。ただし、迅速でそれほど汚れていないアプローチでは、再利用できるコードを実装することをお勧めします...
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;
}
私の経験では、このようなプールを使用して多くのオブジェクトを割り当てる場合、無駄にならないように必要なメモリ量を事前に計算したいと思いますが、間違いを犯したくありません (十分に割り当てないなど)。そこで、すべての割り当てコードをループ内に配置し、空のプールで「ダミー」割り当てを実行するフラグを受け入れるようにプール割り当て関数を設定しました。2 回目のループでは、既にプールのサイズを計算しているので、プールを作成して実際の割り当てをすべて同じ関数呼び出しで行うことができ、コードの重複はありません。メモリが割り当てられていない場合、ポインター演算ではこれを行うことができないため、提案されたプール コードを変更する必要があります。