服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 实现一个内存池管理的类方法

实现一个内存池管理的类方法

2021-04-26 15:52编程猫 C/C++

下面小编就为大家带来一篇实现一个内存池管理的类方法。小编觉得挺不错的现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

模拟STL中的freelist,有这个思想在内。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
union obj
{
 union obj* next;
 char p[1];  
};
 
class MemoryPool
{
   public:
      MemoryPool()
      {
        union obj* temp;
        m_memory.assign(5,(union obj*)NULL);    
        for(int i=0;i<m_memory.size();i++)
        {
          for(int j=0;j<m_memory.size();j++)
          {
           temp = (obj*)malloc(sizeof(char)*(1<<(i+3)));  
           temp->next = m_memory[i];
           m_memory[i] = temp;
          }
        }
      }
      char* mem_get(int size)
      {
        int j;
        if( size > 128)
        {
         char* start = (char*)malloc(sizeof(char)*size);
         return start;
        }
        int index = freelist_index(size);
        obj* temp = m_memory[index];
        if(temp == NULL) //
        {
         for(j = index+1;j<m_memory.size();j++)
         {
           temp = m_memory[j];
           if(temp != NULL)
           {
            m_memory[j] = temp->next;
            break;   
           }  
         }
         if(j>= m_memory.size())
         {
           for(int j=0;j<m_memory.size();j++)
          {
           temp = (obj*)malloc(sizeof(char)*(1<<(index+3)));  
           temp->next = m_memory[index];
           m_memory[index] = temp;
          }
          temp = m_memory[index];
          m_memory[index] = temp->next;
          return (char*)temp;
         }
         else
         {
           obj* cur;
          
           int up_size = round_up(size);
           for(int i=0;i<(1<<(j-index));i++)
           {
            cur = temp;
            cur->next = m_memory[index];
            m_memory[index] = cur;
            temp = cur+up_size;
         
           }
           temp = m_memory[index];
           m_memory[index] = temp->next;
           return (char*)temp;
         }  
        }
        else
        {
         m_memory[index] = temp->next;
         return (char*)temp;
        }
      }
      void mem_free(void* p,int size)
      {
       if(size > 128)
       {
        free(p);
        return
       
       obj* temp = (obj*)p;
       int index = freelist_index(size);
       temp->next = m_memory[index];
       m_memory[index] = temp;
      }
   private:
       enum {_ALIGN = 8};//
       int freelist_index(int __bytes)
       {
         return (((__bytes) + (int)_ALIGN-1)/(size_t)_ALIGN - 1);
       }
       int round_up(int __bytes)
       {
        return (((__bytes) + (int) _ALIGN-1) & ~((int) _ALIGN - 1));
       }
       vector<union obj*> m_memory;
   };

以上这篇实现一个内存池管理的类方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

延伸 · 阅读

精彩推荐