time 
设为首页】【收藏本站
当前位置: 主页 > 程序设计 > C\C++\VC > C++基础 > c++内存池

c++内存池

时间:2009-09-21 00:00 点击:503次 字体:[ ]




 1c++内存池_www.fengfly.com#ifndef __MEMPOOL_H__
 2c++内存池_www.fengfly.com#define __MEMPOOL_H__
 3c++内存池_www.fengfly.com#include "stdio.h"
 4c++内存池_www.fengfly.com#include "stdlib.h"
 5c++内存池_www.fengfly.com#include <string.h>
 6c++内存池_www.fengfly.com
 7c++内存池_www.fengfly.comclass CMemPool
 8c++内存池_www.fengfly.comc++内存池_www.fengfly.com{
 9c++内存池_www.fengfly.comprotected:
10c++内存池_www.fengfly.com    CMemPool()
11c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
12c++内存池_www.fengfly.com
13c++内存池_www.fengfly.com    }

14c++内存池_www.fengfly.compublic:
15c++内存池_www.fengfly.com    ~CMemPool()
16c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
17c++内存池_www.fengfly.com
18c++内存池_www.fengfly.com    }

19c++内存池_www.fengfly.com    virtual int MallocNode(int= 0;
20c++内存池_www.fengfly.com    virtual int FreeNode(int ,int= 0;
21c++内存池_www.fengfly.com    virtual int Init() = 0;
22c++内存池_www.fengfly.com}
;
23c++内存池_www.fengfly.com
24c++内存池_www.fengfly.com#define GET(x,y)    inline x Get_##y()    {\
25c++内存池_www.fengfly.com    return _##y;\
26c++内存池_www.fengfly.com}
27c++内存池_www.fengfly.com
28c++内存池_www.fengfly.com#define SET(x,y)    inline x Set_##y(x t)    {\
29c++内存池_www.fengfly.com    _##y = t;\
30c++内存池_www.fengfly.com    return _##y;\
31c++内存池_www.fengfly.com}
32c++内存池_www.fengfly.com
33c++内存池_www.fengfly.com#define SET_GET(x,y)    SET(x,y)    GET(x,y)
34c++内存池_www.fengfly.com
35c++内存池_www.fengfly.com#define FREE(x)        free(x);x=NULL;
36c++内存池_www.fengfly.com
37c++内存池_www.fengfly.comclass CMemPoolChar:public CMemPool
38c++内存池_www.fengfly.comc++内存池_www.fengfly.com{
39c++内存池_www.fengfly.comprotected:
40c++内存池_www.fengfly.com    int _maxsize;
41c++内存池_www.fengfly.com    int _curpos;
42c++内存池_www.fengfly.compublic:
43c++内存池_www.fengfly.com    char * _data;
44c++内存池_www.fengfly.compublic:
45c++内存池_www.fengfly.com    SET_GET(int,maxsize);
46c++内存池_www.fengfly.com    SET_GET(int,curpos);
47c++内存池_www.fengfly.compublic:
48c++内存池_www.fengfly.comc++内存池_www.fengfly.com    CMemPoolChar(int size):_maxsize(size),_data(NULL),_curpos(0)    {}
49c++内存池_www.fengfly.com    ~CMemPoolChar()
50c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
51c++内存池_www.fengfly.com        if(_data != NULL)
52c++内存池_www.fengfly.comc++内存池_www.fengfly.com        {
53c++内存池_www.fengfly.com            FREE(_data)
54c++内存池_www.fengfly.com        }

55c++内存池_www.fengfly.com    }

56c++内存池_www.fengfly.com    int Init();
57c++内存池_www.fengfly.com    int MallocNode(int );
58c++内存池_www.fengfly.com    int FreeNode(int ,int);
59c++内存池_www.fengfly.com}
;
60c++内存池_www.fengfly.com
61c++内存池_www.fengfly.comtypedef char *(CMemPoolChar::*mempointer);
62c++内存池_www.fengfly.com
63c++内存池_www.fengfly.comtypedef struct _MEM_STRUCT_
64c++内存池_www.fengfly.comc++内存池_www.fengfly.com{
65c++内存池_www.fengfly.com    int _value;
66c++内存池_www.fengfly.com    int _flag;
67c++内存池_www.fengfly.com    _MEM_STRUCT_ * prev;
68c++内存池_www.fengfly.com    _MEM_STRUCT_ * next;
69c++内存池_www.fengfly.com}
MEMSTRUCT,*LPMEMSTRUCT;
70c++内存池_www.fengfly.com
71c++内存池_www.fengfly.comclass CSMemPool:public CMemPool
72c++内存池_www.fengfly.comc++内存池_www.fengfly.com{
73c++内存池_www.fengfly.compublic:
74c++内存池_www.fengfly.com    LPMEMSTRUCT _data;
75c++内存池_www.fengfly.com    LPMEMSTRUCT _free;
76c++内存池_www.fengfly.comprotected:
77c++内存池_www.fengfly.com    int            _maxcell;
78c++内存池_www.fengfly.compublic:
79c++内存池_www.fengfly.com    SET_GET(int,maxcell);
80c++内存池_www.fengfly.comc++内存池_www.fengfly.com    CSMemPool(int num):_maxcell(num)    {_data = _free = NULL;}
81c++内存池_www.fengfly.com    ~CSMemPool();
82c++内存池_www.fengfly.com    int Init();
83c++内存池_www.fengfly.com    int MallocNode(int  = 0);
84c++内存池_www.fengfly.com    int FreeNode(int,int = 0);
85c++内存池_www.fengfly.com}
;
86c++内存池_www.fengfly.com
87c++内存池_www.fengfly.com#endif
88

  1c++内存池_www.fengfly.com#include "mempool.h"
  2c++内存池_www.fengfly.com
  3c++内存池_www.fengfly.comint CMemPoolChar::Init()
  4c++内存池_www.fengfly.comc++内存池_www.fengfly.com{
  5c++内存池_www.fengfly.com    int i_ret = -1;
  6c++内存池_www.fengfly.com    if(Get_maxsize() <= 0)
  7c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
  8c++内存池_www.fengfly.com        return i_ret;
  9c++内存池_www.fengfly.com    }

 10c++内存池_www.fengfly.com    i_ret = -2;
 11c++内存池_www.fengfly.com    _data = (char *)malloc(sizeof(char)*Get_maxsize());
 12c++内存池_www.fengfly.com    if(_data == NULL)
 13c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
 14c++内存池_www.fengfly.com        return i_ret;
 15c++内存池_www.fengfly.com    }

 16c++内存池_www.fengfly.com    i_ret = 0;
 17c++内存池_www.fengfly.com    memset(_data,0,Get_maxsize());
 18c++内存池_www.fengfly.com    return i_ret;
 19c++内存池_www.fengfly.com}

 20c++内存池_www.fengfly.com
 21c++内存池_www.fengfly.comint CMemPoolChar::MallocNode(int len)
 22c++内存池_www.fengfly.comc++内存池_www.fengfly.com{
 23c++内存池_www.fengfly.com    int i_ret = -1;
 24c++内存池_www.fengfly.com    if(Get_curpos() + len >= Get_maxsize())
 25c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
 26c++内存池_www.fengfly.com        return i_ret;
 27c++内存池_www.fengfly.com    }

 28c++内存池_www.fengfly.com    char * tmp = _data+Get_curpos();
 29c++内存池_www.fengfly.com    i_ret = Get_curpos();
 30c++内存池_www.fengfly.com    Set_curpos(Get_curpos()+len);
 31c++内存池_www.fengfly.com    return i_ret;
 32c++内存池_www.fengfly.com}

 33c++内存池_www.fengfly.com
 34c++内存池_www.fengfly.comint CMemPoolChar::FreeNode(int data,int len)
 35c++内存池_www.fengfly.comc++内存池_www.fengfly.com{
 36c++内存池_www.fengfly.com    int i_ret = 0;
 37c++内存池_www.fengfly.com    memset((void *)(_data + data),0,len);
 38c++内存池_www.fengfly.com    memmove(_data+data,_data+data+len,Get_curpos() - data - len);
 39c++内存池_www.fengfly.com    Set_curpos(Get_curpos() - len);
 40c++内存池_www.fengfly.com    memset((void *)(_data + Get_curpos()),0,Get_maxsize() - Get_curpos());
 41c++内存池_www.fengfly.com    i_ret = Get_curpos();
 42c++内存池_www.fengfly.com    return i_ret;
 43c++内存池_www.fengfly.com}

 44c++内存池_www.fengfly.com
 45c++内存池_www.fengfly.com
 46c++内存池_www.fengfly.comCSMemPool::~CSMemPool()
 47c++内存池_www.fengfly.comc++内存池_www.fengfly.com{
 48c++内存池_www.fengfly.com    if(_data != NULL)
 49c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
 50c++内存池_www.fengfly.com        FREE(_data);
 51c++内存池_www.fengfly.com    }

 52c++内存池_www.fengfly.com    _free = NULL;
 53c++内存池_www.fengfly.com    Set_maxcell(0);
 54c++内存池_www.fengfly.com}

 55c++内存池_www.fengfly.com
 56c++内存池_www.fengfly.comint CSMemPool::Init()
 57c++内存池_www.fengfly.comc++内存池_www.fengfly.com{
 58c++内存池_www.fengfly.com    int i_ret = 0;
 59c++内存池_www.fengfly.com    if(Get_maxcell() <= 0)
 60c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
 61c++内存池_www.fengfly.com        Set_maxcell(10);
 62c++内存池_www.fengfly.com    }

 63c++内存池_www.fengfly.com    _data = (LPMEMSTRUCT)malloc(sizeof(MEMSTRUCT)*Get_maxcell());
 64c++内存池_www.fengfly.com    if(_data == NULL)
 65c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
 66c++内存池_www.fengfly.com        return i_ret;
 67c++内存池_www.fengfly.com    }

 68c++内存池_www.fengfly.com    memset(_data,0,sizeof(MEMSTRUCT)*Get_maxcell());
 69c++内存池_www.fengfly.com
 70c++内存池_www.fengfly.com    i_ret = -2;
 71c++内存池_www.fengfly.com    _free = (LPMEMSTRUCT)malloc(sizeof(MEMSTRUCT));
 72c++内存池_www.fengfly.com    if(_data == NULL)
 73c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
 74c++内存池_www.fengfly.com        return i_ret;
 75c++内存池_www.fengfly.com    }

 76c++内存池_www.fengfly.com    memset(_free,0,sizeof(MEMSTRUCT));
 77c++内存池_www.fengfly.com
 78c++内存池_www.fengfly.com    i_ret = 0;
 79c++内存池_www.fengfly.com    LPMEMSTRUCT p = _data;
 80c++内存池_www.fengfly.com    LPMEMSTRUCT q = _free;
 81c++内存池_www.fengfly.com    
 82c++内存池_www.fengfly.com    q->prev = NULL;
 83c++内存池_www.fengfly.com    int i_len = Get_maxcell();
 84c++内存池_www.fengfly.com    while(i_len--)
 85c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
 86c++内存池_www.fengfly.com        q->next = p;
 87c++内存池_www.fengfly.com        p->prev = q;
 88c++内存池_www.fengfly.com        q = p++;
 89c++内存池_www.fengfly.com    }

 90c++内存池_www.fengfly.com    (p-1)->next = _free->next;
 91c++内存池_www.fengfly.com    _free->next->prev = q;
 92c++内存池_www.fengfly.com    return i_ret;
 93c++内存池_www.fengfly.com}

 94c++内存池_www.fengfly.com
 95c++内存池_www.fengfly.com
 96c++内存池_www.fengfly.com
 97c++内存池_www.fengfly.com
 98c++内存池_www.fengfly.comint CSMemPool::MallocNode(int invalid)
 99c++内存池_www.fengfly.comc++内存池_www.fengfly.com{
100c++内存池_www.fengfly.com    if(_free->next == NULL)
101c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
102c++内存池_www.fengfly.comc++内存池_www.fengfly.com        return /*(LPMEMSTRUCT)NULL*/0;
103c++内存池_www.fengfly.com    }

104c++内存池_www.fengfly.com
105c++内存池_www.fengfly.com    //Last Node
106c++内存池_www.fengfly.com    LPMEMSTRUCT p = _free->next->prev;
107c++内存池_www.fengfly.com    if(p == _free->next)
108c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
109c++内存池_www.fengfly.com        _free->next = _free->prev = NULL;
110c++内存池_www.fengfly.com        return (int)p;
111c++内存池_www.fengfly.com    }

112c++内存池_www.fengfly.com
113c++内存池_www.fengfly.com    p->prev->next = _free->next;
114c++内存池_www.fengfly.com    _free->next->prev = p->prev;
115c++内存池_www.fengfly.com    return (int)p;
116c++内存池_www.fengfly.com}

117c++内存池_www.fengfly.com
118c++内存池_www.fengfly.com
119c++内存池_www.fengfly.comc++内存池_www.fengfly.comint CSMemPool::FreeNode(/*LPMEMSTRUCT data*/int datapos,int invalid)
120c++内存池_www.fengfly.comc++内存池_www.fengfly.com{
121c++内存池_www.fengfly.com    if(datapos <= 0)
122c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
123c++内存池_www.fengfly.com        return 0;
124c++内存池_www.fengfly.com    }

125c++内存池_www.fengfly.com    LPMEMSTRUCT data = (LPMEMSTRUCT)datapos;
126c++内存池_www.fengfly.com
127c++内存池_www.fengfly.com    memset(data,0,sizeof(MEMSTRUCT));
128c++内存池_www.fengfly.com    if(_free->next != NULL)
129c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
130c++内存池_www.fengfly.com        LPMEMSTRUCT q = _free->next;
131c++内存池_www.fengfly.com        data->prev = q->prev;
132c++内存池_www.fengfly.com        q->prev = data;
133c++内存池_www.fengfly.com        data->next = q;
134c++内存池_www.fengfly.com        _free->next = data;
135c++内存池_www.fengfly.com    }

136c++内存池_www.fengfly.com    else
137c++内存池_www.fengfly.comc++内存池_www.fengfly.com    {
138c++内存池_www.fengfly.com        _free->next = data;
139c++内存池_www.fengfly.com        data->next = data;
140c++内存池_www.fengfly.com        data->prev = data;
141c++内存池_www.fengfly.com    }

142c++内存池_www.fengfly.com}

143c++内存池_www.fengfly.com
144c++内存池_www.fengfly.comc++内存池_www.fengfly.com/*test*/
145c++内存池_www.fengfly.comint  main(int argc,char * argv[])
146c++内存池_www.fengfly.comc++内存池_www.fengfly.com{
147c++内存池_www.fengfly.com    CSMemPool c(3);
148c++内存池_www.fengfly.com    c.Init();
149c++内存池_www.fengfly.com    LPMEMSTRUCT c3 = (LPMEMSTRUCT)c.MallocNode();
150c++内存池_www.fengfly.com    c.FreeNode((int)c3);
151c++内存池_www.fengfly.com    CMemPoolChar ab(100);
152c++内存池_www.fengfly.com    
153c++内存池_www.fengfly.com    mempointer lppoint = &CMemPoolChar::_data;
154c++内存池_www.fengfly.com    ab.Init();
155c++内存池_www.fengfly.com    char * a1 = ab.*lppoint+ab.MallocNode(15);
156c++内存池_www.fengfly.com    memcpy(a1,"Hello World!",12);
157c++内存池_www.fengfly.com    char * a2 = ab.*lppoint+ab.MallocNode(25);
158c++内存池_www.fengfly.com    memcpy(a2,"echo -e \"Hello World!\"",25);
159c++内存池_www.fengfly.com    char * a3 = ab.*lppoint+ab.MallocNode(25);
160c++内存池_www.fengfly.com    memcpy(a3,"ps -ef |fgrep \"Hello\"",25);
161c++内存池_www.fengfly.com    ab.FreeNode(a2 - ab.*lppoint,25);
162c++内存池_www.fengfly.com    
163c++内存池_www.fengfly.com}

164

    为了减少系统申请,释放内存的开销(有时申请释放频繁,可能会导致系统异常)和程序的有效运行;系统初始化时,将需要申请的内存统一申请下来,如果程序中需要申请空间,可以在预留空间中申请,如果空间已满,可以通过写文件或其它方式处理。



本文地址 : http://www.fengfly.com/plus/view-78127-1.html
标签: C
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: