FreeList.h
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:3k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. #pragma once
  20. #include <stack>
  21. #include <crtdbg.h>
  22. using namespace std;
  23. // 对于大量频繁创建和销毁的对象,存在过多的内存分配/释放操作,
  24. // 使用一个空闲列表可以大大减少内存操作的频度,即:
  25. //     当需要创建对象时,从空闲列表头中提取一个,如果空闲列表为空,则创建对象
  26. //     当需要销毁对象时,将其放到空闲列表尾,如果空闲列表已满,则销毁对象
  27. // 实际上,本类还使用了Over-eager evaluation技术,即:
  28. //     每次需要创建对象时,都预计将会需要更多的对象,所以批量创建,返回第一个,
  29. // 并将剩下的放到空闲列表中,等待预计中的创建请求
  30. template<class T>
  31. class FreeList {
  32. public:
  33. // 构造函数,传入列表大小,和批量分配的个数
  34. FreeList(UINT maxFree, UINT batchNew) : 
  35. m_maxFree(maxFree), m_batchNew(batchNew), m_batchNewList(NULL) {
  36. m_batchNewList = new T*[batchNew];
  37. };
  38. // 析构函数,清空列表,删除批量创建列表
  39. ~FreeList() {
  40. /*
  41. list<T*>::iterator it = m_freeList.begin();
  42. for(; it!= m_freeList.end(); ++it) {
  43. delete (*it);
  44. (*it) = NULL;
  45. }
  46. m_freeList.clear();
  47. */
  48. while(!m_freeList.empty()) {
  49. T* obj = m_freeList.top();
  50. m_freeList.pop();
  51. delete obj;
  52. }
  53. delete [] m_batchNewList;
  54. m_batchNewList = NULL;
  55. };
  56. public:
  57. // 分配并初始化
  58. T* Allocate() {
  59. // 如果空闲列表非空,则从列表头部提取一个
  60. // 如果为空,则批量创建
  61. T* obj = NULL;
  62. if (!m_freeList.empty()) {
  63. obj = m_freeList.top();
  64. _ASSERTE(_CrtIsValidHeapPointer(obj));
  65. m_freeList.pop();
  66. }
  67. else {
  68. // Over-eager evaluation, 每当需要new的时候,预计会需要更多
  69. // 所以一次产生多个,以减少调用new的次数
  70. for(UINT j = 0; j < m_batchNew; ++j) {
  71. m_batchNewList[j] = new T();
  72. _ASSERTE(_CrtIsValidHeapPointer(m_batchNewList[j]));
  73. if(!m_batchNewList[j]) {
  74. printf("ATS::Allocate() out of memory!!! %d", GetLastError()); 
  75. break;
  76. }
  77. }
  78. if(j > 0) {
  79. // 留着第一个返回,把后面的全部加到m_freeList中
  80. obj = m_batchNewList[0];
  81. for(UINT i = 1; i < j; ++i) {
  82. m_freeList.push(m_batchNewList[i]);
  83. }
  84. }
  85. }
  86. // 初始化,为以后的使用作准备
  87. if(obj)
  88. obj->Init();
  89. return obj;
  90. };
  91. // 反初始化并释放
  92. void Release(T* obj) {
  93. if(!obj)
  94. return;
  95. _ASSERTE(_CrtIsValidHeapPointer(obj));
  96. // 首先调用反初始化,释放对象可能关联的资源
  97. obj->Uninit();
  98. // 如果空闲列表未满,就放到空闲列表尾
  99. // 如果已满,就销毁对象
  100. if(m_freeList.size() < m_maxFree)
  101. m_freeList.push(obj);
  102. else {
  103. delete obj;
  104. obj = NULL;
  105. }
  106. };
  107. private:
  108. // 空闲的对象列表
  109. stack<T*> m_freeList;
  110. // 空闲对象的最大个数
  111. const UINT m_maxFree;
  112. // 批量创建的对象指针列表
  113. T** m_batchNewList;
  114. // 批量创建的对象个数
  115. const UINT m_batchNew;
  116. };