前期在文章中贴出了自我实现的一个内存池,原理是针对initPool以内的 Align对齐(8、16...)的内存采用数组+练表表双重管理,以求达到高校的目的,每个内存项有2个字节是用来记录内存大小的,然后在Free中可 以将其对应回归到相应的桶内,InitPool以外的部分直接以链表的形式组织,这样就可以达到处理管理绝大多数内存的目的,在windows上测试性能 要远远高于直接malloc、free,但是在linux上发现情况有所改变,linux的malloc已经经过了内存池的优化处理,所以这个方安在 linux上看起来是画蛇添足,但是经过自己测试辨认发现还是有回旋的余地。
这是我的当初内存项添加的数据
typedef union _MemItem
{
short size;
union _MemItem *next;
}MemItem;
这是linux自身malloc内存池附加的标记
struct mem_block {
int is_available; //这是一个标记
int size; //这是实际空间的大小
};
显然的哦的更为合理有效,正常情况下只需要附加2个字节,但是linux的malloc需要至少8个字节,随后在测试中发现linux的malloc内存 池对于不同断的内存采取不同的管理方式,大约是80字节以前的分配效率是很高的,大于80以后is_available项就不是0或者1这两个值,而是 80的倍数,不明白意思,也不需要知道,只知道在此之后我的内存池就有接管的必要了,为了更好的配合linux,我将自己附加在内存中的值去掉了,合用系 统自身的,然后仅仅笃定是用InitPool个数的控制,比如我在测试中选用的是2000,那么所有申请内存在16*16-2000*16(后面的两个 16是Align步进,也就是256字节到32K之间的)之间的都转由我自定义的内存池控制,基本能够满足用户程序的需求,小于256的部分在加线程锁的 控制后系统本身的还要更优,过大的没有必要加以控制,这样就可以直接交给malloc free处理
综上,我将以前windows上较为复杂的内存池改成如下简化形式:
memorys.h
/*
* File: memorys.h
* Author: net
*内存池
* Created on 2008年4月27日, 上午9:59
*/
#ifndef _MEMORYS_H
#define _MEMORYS_H
#ifdef __cplusplus
extern "C" {
#endif
#define InitMemPool 1000 //初始化池所能拥有的数量,不能超过255*255
#define Align 16 //对齐步进单位,4,8,16等等,每项所能容纳的最大内存为Align*index,index为short int,所以单项最大容量为Align*255*255字节,4字节对齐最大为260K,8字节对齐为512K
#define InitMemItem 12 //初始化池所能拥有的数量不能超过255*255
#define ExpendMemItem 12 //每次扩展池多少项。不能超过255*255
#define MaxMemory 1024*1024*300 //内存池最大容量 300M
#define MinBlock 256 //这是本内存池与malloc性能分界线的一个最小数字
#define MaxBlock Align*InitMemPool //超出
这是我的当初内存项添加的数据
typedef union _MemItem
{
short size;
union _MemItem *next;
}MemItem;
这是linux自身malloc内存池附加的标记
struct mem_block {
int is_available; //这是一个标记
int size; //这是实际空间的大小
};
显然的哦的更为合理有效,正常情况下只需要附加2个字节,但是linux的malloc需要至少8个字节,随后在测试中发现linux的malloc内存 池对于不同断的内存采取不同的管理方式,大约是80字节以前的分配效率是很高的,大于80以后is_available项就不是0或者1这两个值,而是 80的倍数,不明白意思,也不需要知道,只知道在此之后我的内存池就有接管的必要了,为了更好的配合linux,我将自己附加在内存中的值去掉了,合用系 统自身的,然后仅仅笃定是用InitPool个数的控制,比如我在测试中选用的是2000,那么所有申请内存在16*16-2000*16(后面的两个 16是Align步进,也就是256字节到32K之间的)之间的都转由我自定义的内存池控制,基本能够满足用户程序的需求,小于256的部分在加线程锁的 控制后系统本身的还要更优,过大的没有必要加以控制,这样就可以直接交给malloc free处理
综上,我将以前windows上较为复杂的内存池改成如下简化形式:
memorys.h
/*
* File: memorys.h
* Author: net
*内存池
* Created on 2008年4月27日, 上午9:59
*/
#ifndef _MEMORYS_H
#define _MEMORYS_H
#ifdef __cplusplus
extern "C" {
#endif
#define InitMemPool 1000 //初始化池所能拥有的数量,不能超过255*255
#define Align 16 //对齐步进单位,4,8,16等等,每项所能容纳的最大内存为Align*index,index为short int,所以单项最大容量为Align*255*255字节,4字节对齐最大为260K,8字节对齐为512K
#define InitMemItem 12 //初始化池所能拥有的数量不能超过255*255
#define ExpendMemItem 12 //每次扩展池多少项。不能超过255*255
#define MaxMemory 1024*1024*300 //内存池最大容量 300M
#define MinBlock 256 //这是本内存池与malloc性能分界线的一个最小数字
#define MaxBlock Align*InitMemPool //超出