I am looking for a good memory pool implementation in C.
it should include the following:
- Anti fragmentation.
- Be super fast 开发者_StackOverflow:)
- Ability to "bundle" several allocations from different sizes under some identifier and delete all the allocations with the given identifier.
- Thread safe
I think the excellent talloc
, developed as part of samba might be what you're looking for. The part I find most interesting is that any pointer returned from talloc is a valid memory context. Their example is:
struct foo *X = talloc(mem_ctx, struct foo);
X->name = talloc_strdup(X, "foo");
// ...
talloc_free(X); // frees memory for both X and X->name
In response to your particular points:
(1) Not sure what anti-fragmentation is in this case. In C you're not going to get compacting garbage collection anyway, so I think your choices are somewhat limited.
(2) It advertises being only 4% slower than plain malloc(3)
, which is quite fast.
(3) See example above.
(4) It is thread safe as long as different threads use different contexts & the underlying malloc is thread safe.
Have you looked into
- nedmalloc http://www.nedprod.com/programs/portable/nedmalloc/
- ptmalloc http://www.malloc.de/en/
Both leverage a memory pool but keep it mostly transparent to the user.
In general, you will find best performance in your own custom memory pool (you can optimize for your pattern). I ended up writing a few for different access patterns.
For memory pools that have been thoroughly tried and tested you may want to just use the APR ones:
http://apr.apache.org/docs/apr/1.4/apr__pools_8h.html
Mind you, single pools are not thread safe, you'll have to handle that yourself.
bget is another choice. It's well tested and production ready.
http://www.fourmilab.ch/bget/
精彩评论