原創 改進的相對完善的c記憶體池

2021-08-22 18:34:42 字數 4265 閱讀 7847

*本程式為記憶體池解決方案

*程式設計中兼顧了小記憶體碎片中等內尋管理以及大塊記憶體

*設計中參閱了網路的部分記憶體池設計原理,取其精華,本程式池物件分為三個部分,(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 記憶體池的實現

記憶體池是一種自主的記憶體管理機制。就是將我們的記憶體管理放在了應用程式端。那麼它的簡單處理做了什麼事呢?首先,我們從堆上分配出一塊很大的記憶體塊。接著我們按照劃分將其劃分成每個不同的小組。這個每個小組儲存乙個資料塊。針對於每個小組的組內來說就是乙個簡單的資料結構。這個資料結構我們將其分為兩個部分,...