c++变长参数

2019-03-20  本文已影响0人  nit小星星

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

上一篇下一篇

猜你喜欢

热点阅读