美文网首页
c++变长参数

c++变长参数

作者: nit小星星 | 来源:发表于2019-03-20 05:37 被阅读0次

    先看看什么是内存管理系统:
    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

    相关文章

      网友评论

          本文标题:c++变长参数

          本文链接:https://www.haomeiwen.com/subject/kmkamqtx.html