Placement New

7914 ワード


  
  
  
  
  1. class Pool { 
  2. public
  3.     Pool() { /* implementation details irrelevant */ }; 
  4.     virtual ~Pool() { /* ditto */ }; 
  5.  
  6.     virtual void *allocate(size_t); 
  7.     virtual void deallocate(void *); 
  8.  
  9.     static Pool::misc_pool() { return misc_pool_p; /* global MiscPool for general use */ } 
  10. }; 
  11.  
  12. class ClusterPool : public Pool { /* ... */ }; 
  13. class FastPool : public Pool { /* ... */ }; 
  14. class MapPool : public Pool { /* ... */ }; 
  15. class MiscPool : public Pool { /* ... */ }; 
  16.  
  17. // elsewhere... 
  18.  
  19. void *pnew_new(size_t size) 
  20.    return Pool::misc_pool()->allocate(size); 
  21.  
  22. void *pnew_new(size_t size, Pool *pool_p) 
  23.    if (!pool_p) { 
  24.       return Pool::misc_pool()->allocate(size); 
  25.    } 
  26.    else { 
  27.       return pool_p->allocate(size); 
  28.    } 
  29.  
  30. void pnew_delete(void *p) 
  31.    Pool *hp = Pool::find_pool(p); 
  32.    // note: if p == 0, then Pool::find_pool(p) will return 0. 
  33.    if (hp) { 
  34.       hp->deallocate(p); 
  35.    } 
  36.  
  37. // elsewhere... 
  38.  
  39. class Obj { 
  40. public
  41.    // misc ctors, dtors, etc. 
  42.  
  43.    // just a sampling of new/del operators 
  44.    void *operator new(size_t s)             { return pnew_new(s); } 
  45.    void *operator new(size_t s, Pool *hp)   { return pnew_new(s, hp); } 
  46.    void operator delete(void *dp)           { pnew_delete(dp); } 
  47.    void operator delete(void *dp, Pool*)    { pnew_delete(dp); } 
  48.  
  49.    void *operator new[](size_t s)           { return pnew_new(s); } 
  50.    void *operator new[](size_t s, Pool* hp) { return pnew_new(s, hp); } 
  51.    void operator delete[](void *dp)         { pnew_delete(dp); } 
  52.    void operator delete[](void *dp, Pool*)  { pnew_delete(dp); } 
  53. }; 
  54.  
  55. // elsewhere... 
  56.  
  57. ClusterPool *cp = new ClusterPool(arg1, arg2, ...); 
  58.  
  59. Obj *new_obj = new (cp) Obj(arg_a, arg_b, ...); 

http://stackoverflow.com/questions/222557/what-uses-are-there-for-placement-new