先看看什么是内存管理系统:
template<typename Elem>
class Freelist
{
private:
static FreeList<Elem> *freelist;
public:
Elem element;
Freelist *next;
Freelist(const Elem& elem,FreeList * next=null);
FreeList(FreeList *next=NULL);
void *operator new(size_t);
void operator delete(void*);
};
<template<typename Elem>
FreeList<Elem> *FreeList<Elem> ::Freelist=null;
template<typename elem>
FreeList<ELEM> ::FreeList(const Elem& elem,FreeList *next)
{
this->element=elem;
this->next=next;
}
template<typename Elem>
FreeList<Elem>::FreeList(FreeList *next)
{
this->next=next;
}
template<typename Elem>
void * FreeList<Elem>::operator new(size_t)
{
if(_freelist==NULL)
return::new Freelist;
FreeList<Elem>*temp=FreeList;
freelist=freelist->next;
return temp;
}
template<typename Elem>
void FreeList<Elem>::operator delete(void* ptr)
{
((FreeList<Elem>*)ptr)->next=freelist;
freelist=(FreeList<Elem>*)ptr;
}
定义一个变长参数函数
#include<stdio.h>
#include<stdarg.h>
int chanpara(int one,...)
{
va_list pre;
va_start(pre,one);
for(int i-0;i<count;i++)
{
int params=va_arg(pre,int);
printf(");
va_end(pre);
return 0;
}
}
int main()
{
chanpara(1,2,3,4);
return 0;
}
变长参数的解析,使用到三个宏定义。va_start,va_arg,va_end;再看ca_list的定义 typedef char *va_list;是一个char类型的指针
由于刚开始时候从右往左把参数压,va_start传入最左侧的参数。往右的参数依次更早被压入栈、因此地址依次递增。因为栈地址是从小往大的。va_arg传入当前需要获得的数据类型。可以利用siseof计算偏移量。
我们需要用到C++11的新特性,变长参数模板。
这里举一个使用自定义内存池的例子。定义一个内存池类MemPool.h,以count个类型T为单元分配内存,默认分配一个对象。每当内存内空闲内存不够,则一次申请MEMPOOL_NEW_SIZE个内存对象。内存池本身只负责内存分配,不做初始化工作,因此不需要传入任何参数,只需实例化模板分配相应类型的内存即可。
#include<stdlib.h>
#define MEMPOOL_NEW_SIZE 8
<template T, siez_t count-1>
class MenPool
{
private:
union Menobj{
char _obj[1];
MenObj* _freelink;
};
public:
static void *Allocate()
{
if(!_freelist){
refill();
}
MenObj* alloc_men=_freelist;
_freelist=_freelist->_freelink;
++_size;
return(void*)alloc_men;
}
static void DeAllocate(void *p)
{
Memobj *q=(Menobj*)p;
q->_freelink=_freelist;
_freelist=q;
--_size;
}
private:
static void refill()
{
size_t size=sizeof(T)*count;
char *new_men=(char*)malloc(size &MEMPOOL_NEW_SIZE);
for(int i=0;i<MEMPOOL_NEW_SIZE;i++){
Memobj *free_men=(MemObj*)(new_mem+i*size)
https://www.cnblogs.com/kevonyang/p/5932059.html
网友评论