fsa.h
上传用户:szopptop
上传日期:2013-04-23
资源大小:1047k
文件大小:2k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. /*
  2. Fixed Size Allocator
  3. Date:
  4. 2002/03/05
  5. Note:
  6. 皋葛府 且寸/秦力俊 靛绰 厚侩(Cost)苞 窜祈拳(Fragmentation)甫 临捞扁 困茄 努贰胶
  7. */
  8. #ifndef __ORZ_MEMORY_ALLOCATOR__
  9. #define __ORZ_MEMORY_ALLOCATOR__
  10. template< class T >
  11. class CFixedSizeAllocator
  12. {
  13. public:
  14. class CMemBlock
  15. {
  16. public:
  17. T tData;
  18. CMemBlock *pNext;
  19. };
  20. protected:
  21. CMemBlock * m_pMemory;
  22. CMemBlock * m_pFirstFree;
  23. int m_nCapacity;
  24. public:
  25. CFixedSizeAllocator( int nCapacity );
  26. virtual ~CFixedSizeAllocator();
  27. T *  Alloc();
  28. void Free( T *pMemory );
  29. protected:
  30. void ConstructFreeList( int nFrom, int nTo );
  31. };
  32. template< class T >
  33. CFixedSizeAllocator< T >::CFixedSizeAllocator( int nCapacity )
  34. : m_nCapacity( nCapacity )
  35. {
  36. m_pMemory = new CMemBlock[ nCapacity ];
  37. if ( !m_pMemory )
  38. m_nCapacity = 0;
  39. ConstructFreeList( 0, m_nCapacity );
  40. }
  41. template< class T >
  42. CFixedSizeAllocator< T >::~CFixedSizeAllocator()
  43. {
  44. if ( m_pMemory )
  45. delete[] m_pMemory;
  46. }
  47. template< class T >
  48. T * CFixedSizeAllocator< T >::Alloc()
  49. {
  50. if ( !m_pFirstFree )
  51. return NULL;
  52. CMemBlock *pBlock = m_pFirstFree;
  53. m_pFirstFree = pBlock->pNext;
  54. return (T *) pBlock;
  55. }
  56. template< class T >
  57. void CFixedSizeAllocator< T >::Free( T *pMemory )
  58. {
  59. CMemBlock *pBlock = (CMemBlock *) pMemory;
  60. pBlock->pNext = m_pFirstFree;
  61. m_pFirstFree  = pBlock;
  62. }
  63. template< class T >
  64. void CFixedSizeAllocator< T >::ConstructFreeList( int nFrom, int nTo )
  65. {
  66. CMemBlock *pBaseMemory = &m_pMemory[nFrom];
  67. m_pFirstFree = pBaseMemory;
  68. for ( int i = nFrom + 1; i < nTo; i++ )
  69. {
  70. pBaseMemory->pNext = pBaseMemory + 1;
  71. pBaseMemory++;
  72. }
  73. pBaseMemory->pNext = NULL;
  74. }
  75. #endif