*本程式為記憶體池解決方案
*程式設計中兼顧了小記憶體碎片中等內尋管理以及大塊記憶體
*設計中參閱了網路的部分記憶體池設計原理,取其精華,本程式池物件分為三個部分,(0-initmempool)*align(4,8,16等等)大小
*範圍內的記憶體申請在池鍊錶的同時又乙個池指標索引指向池,比如,設定initmempool為256,就會有256個被提前初始化,索引依次
*為1、2、3、...256,對應管理的記憶體片大小為1*align、2*align、3*align.....256*align,其中align為基本對齊單位,預設為4,如果申
*請的記憶體比較大可以設定為8,前256(initmempool)個會索引指標,通過下標就能引用,大於此範圍的內存在initmempool鍊錶之後
*緊密附加在後面,不會產生空檔,提起需要便利後面部分方能得到,當申請的記憶體大於255*255*align的時候就超出了本記憶體池的管理範圍
*一般來講即使最小設定align為4也可以達到260k的最大記憶體管理,如果不夠用可以加大align,再大了管理起來也就沒意思了,記憶體管理的
*每塊記憶體前面保留2個字元的unsigned short int型別的大小資料,用來儲存資料塊大小,方便free的時候使用
*本程式經過車是效能已經超過我所參考的大部分程式池,安全方面暫時沒有加入執行緒鎖,接下來的改進可能將鎖儲存在池煉表中,對單項進行加鎖
*/memory.c
#include "memory.h"
static mempool * heap=null;//分界線
static mempool * top_of_heap=null;//池集合的頭部
static mempool * btm_of_heap=null;//池集合的尾部
int index=1;
mempool * poolindex[initmempool];
static long totalbyte;
static int alignnum(int size)
/***取會給定結構的池結構體
*/mempool * getpool(unsigned int name)
else
p=p->next;
}return null;
}/*新定義乙個池項*/
mempool *newpoolitem(unsigned int name)
else}}
else
}/*初始化池*/
void initpool(void)
p->next=null;
top_of_heap=p;
heap=p;/*標示移動到poolindex的最後面,如果有超出index大小的新池就用這個指標來分隔標示*/
}void expendpool(void)
p->next=null;
top_of_heap=p;
}void freepool(mempool *p)
return;
}/*初始化項*/
void inititem(unsigned int name)
else if(name<=initmempool)
p=poolindex[name-1];
else
p=getpool(name);
p->total_item+=(p->init_item==0?initmemitem:p->init_item);
p->first=(memitem *)malloc(name*align);/*建立第乙個塊*/
ip=p->first;
for(blk=1;blk<(p->init_item==0?initmemitem:p->init_item);++blk)
ip->next=null;
p->last=ip;
totalbyte+=name*align*(p->init_item==0?initmemitem:p->init_item);
}/*擴充套件當前池項的下屬記憶體塊*/
void expenditem(unsigned int name)
ip->next=null;
p->last=ip;
totalbyte+=name*align*(p->per_expend_item==0?expendmemitem:p->per_expend_item);
//printf("kuozan ");
}/*申請心記憶體-〉記憶體池*/
void *new(unsigned int name)
name=(((name+2)+align-1) &~ (align-1))/align;
mempool *p;
if(btm_of_heap==null)
if(name<=initmempool)
p=poolindex[name-1];
else
p=getpool(name);
if(p->first!=null)
else
}else
}/*記憶體池***/
void free(void *myp)
if(ip->size<=initmempool)
p=poolindex[ip->size-1];
else
p=getpool(ip->size);
if(p==null)
if(p->first!=null)
else
return;
}/*輸出除錯函式*/
void printpool(void)
}pool=pool->next;}}
memory.h
#ifndef mempool_h__
#define mempool_h__
#define initmempool 10 //初始化池所能擁有的數量,不能超過255*255
#define expendmempool 5 //每次擴充套件池多少項
#define align 4 //對齊步進單位,4,8,16等等,每項所能容納的最大記憶體為align*index,index為short int,所以單項最大容量為align*255*255位元組,4位元組對齊最大為260k,8位元組對齊為512k
#define initmemitem 100 //初始化池所能擁有的數量不能超過255*255
#define expendmemitem 100 //每次擴充套件池多少項。不能超過255*255
#define maxmemory 1024*1024*300 //記憶體池最大容量 300m
#define new(type) ((type *)(new(sizeof(type))))
#define sizes sizeof(mempool)
#include
#include
#include
#include "types.h"
/***該結構用乙個自增長的鍊錶結構體儲存分鍊錶,每個結構體中包含具體鍊錶的頭部、尾部和空閒分界線指標,維護乙個鍊錶
*大致結構如下:
* mempool
* v v v ...
* 鍊錶1 鍊錶2 鍊錶3 ...
*通過這樣乙個結構系統就可以靈活增加減少系統池,並且可以控制池內結構,控制總資料量**/
typedef union _memitem memitem;
typedef struct _mempool mempool;
union _memitem
;/*池集合*/
struct _mempool
;/**
*取會給定結構的池結構體
*/static int alignnum(int size);
mempool * getpool(unsigned int name);
mempool *newpoolitem(unsigned int name);
void initpool(void);/*初始化池*/
void expendpool(void);/*擴充套件池*/
void freepool(mempool * p);/*釋放池*/
void inititem(unsigned int name);//初始化具體項的鍊錶
void *new(unsigned int name);//初始化具體項的鍊錶
void expenditem(unsigned int name);//初始化擴充套件項的鍊錶
void free(void *myp);//釋放具體一項
void printpool(void);
#endif
C 記憶體池的實現
file memorypool.h note hangzhou hikvision system technology co.ltd.all right reserved.brief windows下記憶體池的實現 author zhangpeng nj 163.com date 11 15 201...
記憶體池的C 實現。
原文 最近在學習c 程式效能優化,讀到記憶體池部分。自己動手寫了乙個,小小測試了一下應該沒有問題。記憶體塊memoryblock宣告檔案 cpp view plain copy pragma once define ushort unsigned short define ulong unsigne...
C 記憶體池的實現
記憶體池是一種自主的記憶體管理機制。就是將我們的記憶體管理放在了應用程式端。那麼它的簡單處理做了什麼事呢?首先,我們從堆上分配出一塊很大的記憶體塊。接著我們按照劃分將其劃分成每個不同的小組。這個每個小組儲存乙個資料塊。針對於每個小組的組內來說就是乙個簡單的資料結構。這個資料結構我們將其分為兩個部分,...