├── Makefile ├── main.c ├── memory_pool.c └── memory_pool.h /Makefile: -------------------------------------------------------------------------------- 1 | OBJS = memory_pool.o main.o 2 | 3 | main: $(OBJS) 4 | gcc $(OBJS) -o main 5 | main.o: main.c memory_pool.h 6 | gcc --std=c++11 -c main.c -o main.o 7 | memory_pool.o: memory_pool.c memory_pool.h 8 | gcc --std=c++11 -c memory_pool.c -o memory_pool.o 9 | clean: 10 | rm -rf *.o main 11 | -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | #include "memory_pool.h" 2 | #include 3 | #include 4 | #include 5 | 6 | int main() { 7 | s_memory_pool *mp = memory_pool_create(4); 8 | struct timeval start; 9 | struct timeval end; 10 | 11 | int t[] = {20000, 40000, 80000, 100000, 120000, 140000, 160000, 180000, 200000}; 12 | int s = sizeof(t)/sizeof(int); 13 | 14 | int i = 0; 15 | for (; i < s; ++i) { 16 | gettimeofday(&start, NULL); 17 | int j = 0; 18 | for (; j < t[i]; ++j) { 19 | 20 | void *p = memory_alloc(mp); 21 | memory_free(mp, p); 22 | // 23 | //void *p = malloc(8); 24 | //free(p); 25 | } 26 | gettimeofday(&end, NULL); 27 | long cost = 1000000 * (end.tv_sec - start.tv_sec) + 28 | end.tv_usec - start.tv_usec; 29 | 30 | printf("%ld\n",cost); 31 | } 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /memory_pool.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "memory_pool.h" 4 | 5 | #define MEMPOOL_ALIGNMENT 4 6 | 7 | 8 | 9 | s_memory_pool *memory_pool_create(unsigned int size) 10 | { 11 | s_memory_pool *mp; 12 | mp = (s_memory_pool*)malloc(sizeof(s_memory_pool)); 13 | mp->first_block = NULL; 14 | mp->init_size = 5; 15 | mp->grow_size = 5; 16 | 17 | if(size < sizeof(unsigned int)) 18 | mp->obj_size = sizeof(unsigned int); 19 | mp->obj_size = (size + (MEMPOOL_ALIGNMENT-1)) & ~(MEMPOOL_ALIGNMENT-1); 20 | 21 | return mp; 22 | } 23 | 24 | /***********************************************************************************************************/ 25 | /* memory_alloc 26 | * return a free memory 27 | * allocate memory in memory_pool 28 | */ 29 | inline void *memory_alloc(s_memory_pool *mp) 30 | { 31 | 32 | register unsigned int i; 33 | register char *data; 34 | //unsigned int length; 35 | 36 | if(mp->first_block == NULL)//memory_pool is NULL 37 | { 38 | 39 | s_memory_block *mb; 40 | mb = (s_memory_block *)malloc((mp->init_size)*(mp->obj_size) + sizeof(s_memory_block));//create first memory_block 41 | if(mb == NULL) 42 | { 43 | perror("memory allocate failed!\n"); 44 | return NULL; 45 | } 46 | 47 | /* init the first block */ 48 | mb->next = NULL; 49 | mb->free_size = mp->init_size - 1; 50 | mb->first_free = 1; 51 | mb->size = mp->init_size*mp->obj_size; 52 | 53 | mp->first_block = mb; 54 | 55 | data = mb->a_data; 56 | 57 | /* set the mark */ 58 | for(i=1; iinit_size; ++i) 59 | { 60 | *(unsigned int *)data = i; 61 | 62 | data += mp->obj_size; 63 | } 64 | 65 | printf("first_free: %d\n", mb->first_free); 66 | char *dt = mb->a_data; 67 | for (i = 1; i < mp->init_size; ++i) { 68 | printf("data value: %d\n", *(unsigned int *)dt); 69 | dt += mp->obj_size; 70 | } 71 | 72 | return (void *)mb->a_data; 73 | } 74 | 75 | s_memory_block *pm_block = mp->first_block; 76 | 77 | while((pm_block!=NULL) && (pm_block->free_size==0)) 78 | { 79 | pm_block = pm_block->next; 80 | } 81 | 82 | if(pm_block != NULL) 83 | { 84 | char *pfree = pm_block->a_data + pm_block->first_free * mp->obj_size; 85 | 86 | pm_block->first_free = *((unsigned int *)pfree); 87 | pm_block->free_size--; 88 | 89 | printf("first_free: %d\n", pm_block->first_free); 90 | char *dt = pm_block->a_data; 91 | for (i = 1; i < mp->init_size; ++i) { 92 | printf("data value: %d\n", *(unsigned int *)dt); 93 | dt += mp->obj_size; 94 | } 95 | 96 | return (void *)pfree; 97 | } 98 | else 99 | { 100 | if(mp->grow_size == 0) 101 | return NULL; 102 | s_memory_block *new_block = (s_memory_block *)malloc((mp->grow_size)*(mp->obj_size) + sizeof(s_memory_block)); 103 | 104 | if(new_block == NULL) 105 | return NULL; 106 | 107 | data = new_block->a_data; 108 | 109 | for(i=1; igrow_size; ++i) 110 | { 111 | *(unsigned int *)data = i; 112 | data += mp->obj_size; 113 | } 114 | 115 | new_block->size = mp->grow_size*mp->obj_size; 116 | new_block->free_size = mp->grow_size-1; 117 | new_block->first_free = 1; 118 | new_block->next = mp->first_block; 119 | mp->first_block = new_block; 120 | 121 | return (void *)(new_block->a_data); 122 | } 123 | } 124 | 125 | 126 | /***********************************************************************************************************/ 127 | /* memory_free 128 | * free memory to memory_pool 129 | */ 130 | inline void* memory_free(s_memory_pool *mp, void *pfree) 131 | { 132 | if(mp->first_block == NULL) 133 | return; 134 | 135 | s_memory_block *pm_block = mp->first_block; 136 | s_memory_block *pm_pre_block = mp->first_block; 137 | 138 | /* research the memory_block which the pfree in */ 139 | while(pm_block && ((unsigned int)pfree<(unsigned int)pm_block->a_data || 140 | (unsigned int)pfree>((unsigned int)pm_block->a_data+pm_block->size))) 141 | { 142 | //pm_pre_block = pm_block; 143 | pm_block = pm_block->next; 144 | 145 | if(pm_block == NULL) 146 | return NULL; 147 | } 148 | 149 | unsigned int offset = pfree -(void*) pm_block->a_data; 150 | 151 | if((offset&(mp->obj_size -1)) > 0) 152 | return pfree; 153 | 154 | pm_block->free_size++; 155 | *((unsigned int *)pfree) = pm_block->first_free; 156 | 157 | pm_block->first_free=(unsigned int)(offset/mp->obj_size); 158 | 159 | return NULL; 160 | 161 | 162 | /*pm_block->free_size++; 163 | 164 | *((unsigned int *)pfree) = pm_block->first_free; 165 | 166 | pm_block->first_free = (unsigned short)((unsigned int)pfree - (unsigned int)pm_block->a_data)/mp->obj_size; 167 | 168 | if(pm_block->free_size*mp->obj_size == pm_block->size) 169 | { 170 | pm_pre_block->next = pm_block->next; 171 | 172 | if((unsigned int)pm_pre_block == (unsigned int)mp->first_block) 173 | mp->first_block = NULL; 174 | 175 | free(pm_block); 176 | }*/ 177 | } 178 | 179 | 180 | /***********************************************************************************************************/ 181 | /* free_memory_pool 182 | * free memory_pool 183 | */ 184 | void free_memory_pool(s_memory_pool *mp) 185 | { 186 | s_memory_block *mb = mp->first_block; 187 | 188 | if(mb != NULL) 189 | { 190 | 191 | while(mb->next != NULL) 192 | { 193 | s_memory_block *delete_block = mb; 194 | mb = mb->next; 195 | 196 | free(delete_block); 197 | } 198 | 199 | free(mb); 200 | } 201 | 202 | 203 | free(mp); 204 | } 205 | 206 | -------------------------------------------------------------------------------- /memory_pool.h: -------------------------------------------------------------------------------- 1 | #ifndef _MEMORY_POOL_H 2 | #define _MEMORY_POOL_H 3 | 4 | typedef struct memory_block 5 | { 6 | unsigned int size; 7 | unsigned int free_size; 8 | unsigned int first_free; 9 | 10 | struct memory_block *next; 11 | char a_data[1]; 12 | } s_memory_block; 13 | 14 | typedef struct memory_pool 15 | { 16 | unsigned int obj_size; 17 | unsigned int init_size; 18 | unsigned int grow_size; 19 | 20 | s_memory_block *first_block; 21 | } s_memory_pool; 22 | 23 | s_memory_pool *memory_pool_create(unsigned int size); 24 | 25 | /***************************************************************************** 26 | * memory_alloc 27 | 28 | * @func allocate the memory from memory_pool to object 29 | * @name memory_alloc 30 | * @param mp the structure of memory_pool 31 | */ 32 | void *memory_alloc(s_memory_pool *mp); 33 | 34 | /***************************************************************************** 35 | * memory_free 36 | 37 | * @func free the memory from object to memory_pool 38 | * @name memory_free 39 | * @param mp the structure of memory_pool 40 | * @param pfree the memory that will be free 41 | */ 42 | void *memory_free(s_memory_pool *mp, void *pfree); 43 | 44 | /***************************************************************************** 45 | * free_memory_pool 46 | 47 | * @func free the memory_pool 48 | * @name free_memory_pool 49 | * @param mp the structure of memory_pool 50 | */ 51 | void free_memory_pool(s_memory_pool *mp); 52 | 53 | #endif 54 | 55 | 56 | --------------------------------------------------------------------------------