Buffers.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. /***********************************************************************/
  2. //文 件 名:CBuffers.cpp
  3. //功 能:CBuffers类实现
  4. /***********************************************************************/
  5. #include "pch.h"
  6. #include "Buffers.h"
  7. #include <windows.h>
  8. #ifdef _DEBUG
  9. #include "stdio.h"
  10. #include <iostream>
  11. using namespace std;
  12. #endif
  13. //直接从zwl_memory中搬过来
  14. //属于粗放型的内存管理
  15. template<class _Tc>class template_malloc
  16. {
  17. #ifdef _DEBUG
  18. //检测用
  19. public:
  20. unsigned int nItems;
  21. #endif
  22. #pragma pack(push,1) //强制本结构1字节对齐
  23. typedef struct tagItem
  24. {
  25. union
  26. {
  27. tagItem*next;
  28. size_t size;
  29. };
  30. _Tc data;
  31. }ITEM,*PITEM;
  32. #pragma pack(pop)
  33. public:
  34. char* mlloc(void)
  35. {
  36. if(!__item__) return(NULL);
  37. PITEM pitem = __item__;
  38. __item__ = __item__->next;
  39. pitem->size = sizeof(_Tc);
  40. #ifdef _DEBUG
  41. nItems--;
  42. #endif
  43. return(pitem->data);
  44. }
  45. #ifdef _DEBUG
  46. int getItemCount(){
  47. return nItems;
  48. }
  49. #endif
  50. void release(char*pdata)
  51. {
  52. PITEM pitem=(PITEM)pdata;
  53. memset(pitem,0,sizeof(ITEM));
  54. pitem->next = __item__;
  55. __item__ = pitem;
  56. #ifdef _DEBUG
  57. nItems++;
  58. #endif
  59. }
  60. void clean(void)
  61. {
  62. char*lpData=NULL;
  63. for(PITEM pnext=NULL;__item__;__item__=pnext)
  64. {
  65. pnext = __item__->next;
  66. lpData = (char*)__item__;
  67. delete[] lpData;
  68. }
  69. }
  70. template_malloc(void):__item__(NULL)
  71. {
  72. #ifdef _DEBUG
  73. nItems = 0;
  74. #endif
  75. }
  76. ~template_malloc(void)
  77. {
  78. clean();
  79. }
  80. PITEM __item__;
  81. };
  82. #define __malloc__(T,P)\
  83. else if(lsize<=T)\
  84. {\
  85. lpData=P.mlloc();\
  86. _size = T;\
  87. }
  88. class memory_factory
  89. {
  90. public:
  91. char*malloc( size_t lsize, size_t* msize )
  92. {
  93. char*lpData=NULL;
  94. size_t _size(0);
  95. EnterCriticalSection(&__lock__);
  96. if(lsize<=16)
  97. {
  98. lpData = _alloc_16.mlloc();
  99. _size = 16;
  100. }
  101. __malloc__(32,_alloc_32)
  102. __malloc__(64,_alloc_64)
  103. __malloc__(128,_alloc_128)
  104. __malloc__(256,_alloc_256)
  105. __malloc__(512,_alloc_512)
  106. __malloc__(1024,_alloc_1k)
  107. __malloc__(1024*2L,_alloc_2k)
  108. __malloc__(1024*4L,_alloc_4k)
  109. __malloc__(1024*8L,_alloc_8k)
  110. __malloc__(1024*16L,_alloc_16k)
  111. __malloc__(1024*32L,_alloc_32k)
  112. __malloc__(1024*64L,_alloc_64k)
  113. __malloc__(1024*128L,_alloc_128k)
  114. __malloc__(1024*256L,_alloc_256k)
  115. __malloc__(1024*512L,_alloc_512k)
  116. __malloc__(1024*1024L,_alloc_1m)
  117. //__malloc__(2*1024*1024L,_alloc_2m)
  118. //__malloc__(3*1024*1024L,_alloc_3m)
  119. //__malloc__(4*1024*1024L,_alloc_4m)
  120. //__malloc__(8*1024*1024L,_alloc_8m)
  121. //__malloc__(16*1024*1024L,_alloc_16m)
  122. //__malloc__(32*1024*1024L,_alloc_32m)
  123. else
  124. {
  125. _size=lsize;
  126. }
  127. LeaveCriticalSection(&__lock__);
  128. if(!lpData)
  129. {
  130. char*lpMalloc=new char[ _size + sizeof( size_t ) ];
  131. if(!lpMalloc) return(NULL);
  132. *(size_t*)lpMalloc = _size;
  133. memset(lpData=lpMalloc + sizeof( size_t ), 0, _size );
  134. }
  135. #ifdef _DEBUG
  136. else {
  137. nCount --;
  138. }
  139. #endif
  140. if(msize) *msize = _size;
  141. return(lpData);
  142. }
  143. void release(char*lpData)
  144. {
  145. if( lpData == NULL )
  146. return;
  147. char* lpMalloc = lpData - sizeof( size_t );
  148. EnterCriticalSection(&__lock__);
  149. switch( *( size_t* )lpMalloc )
  150. {
  151. case 16: _alloc_16.release(lpMalloc); break;
  152. case 32: _alloc_32.release(lpMalloc); break;
  153. case 64: _alloc_64.release(lpMalloc); break;
  154. case 128: _alloc_128.release(lpMalloc); break;
  155. case 256: _alloc_256.release(lpMalloc); break;
  156. case 512: _alloc_512.release(lpMalloc); break;
  157. case 1024: _alloc_1k.release(lpMalloc); break;
  158. case 1024*2L: _alloc_2k.release(lpMalloc); break;
  159. case 1024*4L: _alloc_4k.release(lpMalloc); break;
  160. case 1024*8L: _alloc_8k.release(lpMalloc); break;
  161. case 1024*16L: _alloc_16k.release(lpMalloc); break;
  162. case 1024*32L: _alloc_32k.release(lpMalloc); break;
  163. case 1024*64L: _alloc_64k.release(lpMalloc); break;
  164. case 1024*128L: _alloc_128k.release(lpMalloc); break;
  165. case 1024*256L: _alloc_256k.release(lpMalloc); break;
  166. case 1024*512L: _alloc_512k.release(lpMalloc); break;
  167. case 1024*1024L: _alloc_1m.release(lpMalloc); break;
  168. // case 2*1024*1024L: _alloc_2m.release(lpMalloc); break;
  169. // case 3*1024*1024L: _alloc_3m.release(lpMalloc); break;
  170. // case 4*1024*1024L: _alloc_4m.release(lpMalloc); break;
  171. // case 8*1024*1024L: _alloc_8m.release(lpMalloc); break;
  172. // case 16*1024*1024L: _alloc_16m.release(lpMalloc); break;
  173. // case 32*1024*1024L: _alloc_32m.release(lpMalloc); break;
  174. default: delete[] lpMalloc;
  175. }
  176. LeaveCriticalSection(&__lock__);
  177. #ifdef _DEBUG
  178. nCount ++;
  179. #endif
  180. }
  181. void clean(void)
  182. {
  183. EnterCriticalSection(&__lock__);
  184. _alloc_16.clean();
  185. _alloc_32.clean();
  186. _alloc_64.clean();
  187. _alloc_128.clean();
  188. _alloc_256.clean();
  189. _alloc_512.clean();
  190. _alloc_1k.clean();
  191. _alloc_2k.clean();
  192. _alloc_4k.clean();
  193. _alloc_8k.clean();
  194. _alloc_16k.clean();
  195. _alloc_32k.clean();
  196. _alloc_64k.clean();
  197. _alloc_128k.clean();
  198. _alloc_256k.clean();
  199. _alloc_512k.clean();
  200. _alloc_1m.clean();
  201. _alloc_2m.clean();
  202. _alloc_3m.clean();
  203. _alloc_4m.clean();
  204. _alloc_8m.clean();
  205. _alloc_16m.clean();
  206. _alloc_32m.clean();
  207. LeaveCriticalSection(&__lock__);
  208. }
  209. memory_factory(void)
  210. {
  211. InitializeCriticalSection(&__lock__);
  212. #ifdef _DEBUG
  213. nCount = 0;;
  214. #endif
  215. }
  216. ~memory_factory(void)
  217. {
  218. clean();
  219. DeleteCriticalSection(&__lock__);
  220. }
  221. #ifdef _DEBUG
  222. int getItemCount(){
  223. return nCount;
  224. }
  225. #endif
  226. template_malloc<char[16]> _alloc_16;
  227. template_malloc<char[32]> _alloc_32;
  228. template_malloc<char[64]> _alloc_64;
  229. template_malloc<char[128]> _alloc_128;
  230. template_malloc<char[256]> _alloc_256;
  231. template_malloc<char[512]> _alloc_512;
  232. template_malloc<char[1024]> _alloc_1k;
  233. template_malloc<char[1024*2L]> _alloc_2k;
  234. template_malloc<char[1024*4L]> _alloc_4k;
  235. template_malloc<char[1024*8L]> _alloc_8k;
  236. template_malloc<char[1024*16L]> _alloc_16k;
  237. template_malloc<char[1024*32L]> _alloc_32k;
  238. template_malloc<char[1024*64L]> _alloc_64k;
  239. template_malloc<char[1024*128L]> _alloc_128k;
  240. template_malloc<char[1024*256L]> _alloc_256k;
  241. template_malloc<char[1024*512L]> _alloc_512k;
  242. template_malloc<char[1024*1024L]> _alloc_1m;
  243. template_malloc<char[1024*1024L*2]> _alloc_2m;
  244. template_malloc<char[1024*1024L*3]> _alloc_3m;
  245. template_malloc<char[1024*1024L*4]> _alloc_4m;
  246. template_malloc<char[1024*1024L*8]> _alloc_8m;
  247. template_malloc<char[1024*1024L*16]> _alloc_16m;
  248. template_malloc<char[1024*1024L*32]> _alloc_32m;
  249. CRITICAL_SECTION __lock__;
  250. #ifdef _DEBUG
  251. int nCount;
  252. #endif
  253. }__memory__;
  254. CBuffers::CBuffers(LPVOID lpBuffer):
  255. bufData((LPSTR)lpBuffer),sizeData(0),sizeMalloc(0)
  256. {
  257. if(bufData){
  258. sizeMalloc = *( size_t* )( (char*)lpBuffer - sizeof( size_t ) );
  259. }
  260. }
  261. CBuffers::~CBuffers(void)
  262. {
  263. if(bufData)
  264. {
  265. __memory__.release(bufData);
  266. bufData = 0;
  267. }
  268. }
  269. /////////////////////////////////////////////////////////////////////////////
  270. LPSTR CBuffers::GetBuf(size_t lsize)
  271. {
  272. if( ( lsize + 1 ) > sizeMalloc )
  273. {
  274. if(bufData)
  275. {
  276. __memory__.release(bufData);
  277. bufData = 0;
  278. }
  279. bufData=__memory__.malloc( lsize + 1, &sizeMalloc );
  280. }
  281. if( bufData && sizeMalloc )
  282. memset( bufData, 0, sizeMalloc );
  283. sizeData = lsize;
  284. return(bufData);
  285. }
  286. void CBuffers::Release(void)
  287. {
  288. if(bufData)
  289. {
  290. __memory__.release(bufData);
  291. bufData = 0;
  292. }
  293. sizeData = sizeMalloc = 0;
  294. }
  295. char * CBuffers::Copy(void * lpData, size_t lsize)
  296. {
  297. if(!GetBuf(lsize+1)) return(0); //避免字符串等不注意的情形,多分配一点
  298. if(lsize)
  299. {
  300. memcpy(bufData,lpData,lsize);
  301. }
  302. sizeData = lsize;
  303. return(bufData);
  304. }
  305. char * CBuffers::Append(void * lpData, size_t lsize)
  306. {
  307. if(lsize)
  308. {
  309. if(!Extern(sizeData+lsize+1)) return(0);
  310. memcpy(bufData+sizeData,lpData,lsize);
  311. sizeData += lsize;
  312. }
  313. return(bufData);
  314. }
  315. char * CBuffers::Extern( size_t maxSize)
  316. {
  317. if(maxSize>sizeMalloc)
  318. {
  319. size_t sizeNew(0);
  320. char * bufNew=__memory__.malloc(maxSize, &sizeNew );
  321. if(!bufNew) return(0);
  322. if(bufData)
  323. {
  324. if(sizeData) memcpy(bufNew,bufData,sizeData);
  325. if(bufData)
  326. {
  327. __memory__.release(bufData);
  328. bufData = 0;
  329. }
  330. }
  331. bufData = bufNew;
  332. sizeMalloc = sizeNew;
  333. }
  334. return(bufData);
  335. }
  336. CBuffers::operator const char *(void) const
  337. {
  338. return(bufData);
  339. }
  340. const CBuffers&CBuffers::operator=(const char * lpString)
  341. {
  342. Copy((void*)lpString,lstrlenA(lpString));
  343. return(*this);
  344. }
  345. const CBuffers&CBuffers::operator+=(const char * lpString)
  346. {
  347. Append((void*)lpString,lstrlenA(lpString));
  348. return(*this);
  349. }
  350. void CBuffers::Attach(CBuffers*pMemory)
  351. {
  352. if(bufData)
  353. {
  354. __memory__.release(bufData);
  355. bufData = 0;
  356. }
  357. sizeData = pMemory->sizeData;
  358. sizeMalloc = pMemory->sizeMalloc;
  359. bufData = pMemory->bufData;
  360. pMemory->sizeData = pMemory->sizeMalloc = 0;
  361. pMemory->bufData = 0;
  362. }
  363. void CBuffers::Detach()
  364. {
  365. bufData = NULL;
  366. }