code_junkie

C++'s “placement new”

Nov 11th, 2011
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. void placement() {
  2.  
  3. char *buf = new char[1000]; //pre-allocated buffer
  4. string *p = new (buf) string("hi"); //placement new
  5. string *q = new string("hi"); //ordinary heap allocation
  6.  
  7. class Pool {
  8. public:
  9. Pool() { /* implementation details irrelevant */ };
  10. virtual ~Pool() { /* ditto */ };
  11.  
  12. virtual void *allocate(size_t);
  13. virtual void deallocate(void *);
  14.  
  15. static Pool::misc_pool() { return misc_pool_p; /* global MiscPool for general use */ }
  16. };
  17.  
  18. class ClusterPool : public Pool { /* ... */ };
  19. class FastPool : public Pool { /* ... */ };
  20. class MapPool : public Pool { /* ... */ };
  21. class MiscPool : public Pool { /* ... */ };
  22.  
  23. // elsewhere...
  24.  
  25. void *pnew_new(size_t size)
  26. {
  27. return Pool::misc_pool()->allocate(size);
  28. }
  29.  
  30. void *pnew_new(size_t size, Pool *pool_p)
  31. {
  32. if (!pool_p) {
  33. return Pool::misc_pool()->allocate(size);
  34. }
  35. else {
  36. return pool_p->allocate(size);
  37. }
  38. }
  39.  
  40. void pnew_delete(void *p)
  41. {
  42. Pool *hp = Pool::find_pool(p);
  43. // note: if p == 0, then Pool::find_pool(p) will return 0.
  44. if (hp) {
  45. hp->deallocate(p);
  46. }
  47. }
  48.  
  49. // elsewhere...
  50.  
  51. class Obj {
  52. public:
  53. // misc ctors, dtors, etc.
  54.  
  55. // just a sampling of new/del operators
  56. void *operator new(size_t s) { return pnew_new(s); }
  57. void *operator new(size_t s, Pool *hp) { return pnew_new(s, hp); }
  58. void operator delete(void *dp) { pnew_delete(dp); }
  59. void operator delete(void *dp, Pool*) { pnew_delete(dp); }
  60.  
  61. void *operator new[](size_t s) { return pnew_new(s); }
  62. void *operator new[](size_t s, Pool* hp) { return pnew_new(s, hp); }
  63. void operator delete[](void *dp) { pnew_delete(dp); }
  64. void operator delete[](void *dp, Pool*) { pnew_delete(dp); }
  65. };
  66.  
  67. // elsewhere...
  68.  
  69. ClusterPool *cp = new ClusterPool(arg1, arg2, ...);
  70.  
  71. Obj *new_obj = new (cp) Obj(arg_a, arg_b, ...);
Add Comment
Please, Sign In to add comment