美文网首页
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++变长参数

    先看看什么是内存管理系统:template class Freelist { pri...

  • C++的变长参数

    在学习《EffectiveModernCpp》这本书中接触到不少变长参数的用法,在这里对网络上一些写得比较好的中文...

  • 007_scala编程详解函数入门之变长参数

    变长参数 使用序列调用变长参数 scala知识点

  • 11章 运行库

    1 入口点 (Entry Point) 和 程序初始化 2 C/C++ 运行库 (1) 变长参数 机制: 得益于 ...

  • 别让null值和空值威胁到变长方法

    上一建议讲解了变长参数的重载问题,本建议还会继续讨论变长参数的重载问题。上一建议的例子是变长参数的范围覆盖了非变长...

  • JavaSE进阶十一 反射机制二

    1,可变长度参数 语法:类型... (注意:一定是3个点) 可变长度参数要求参数个数是:0-N个。 可变长度参数在...

  • 具名参数 变长参数

    1.具名参数 fun main(args: Array) { sum(b = 1,a = 1) } fun sum...

  • python基础知识的理解

    一、变长参数 Non-keyword Variable Arguments (Tuple)——非关键字可变长参数(...

  • python基础-day2

    不定参数(变长参数 ) ado使用 ... 表示变长参数,那py呢?python自定义函数中有两中不定长参数,第一...

  • Scala-简明速学02-函数

    Scala 简明速学02 函数 变长参数 Scala中可以将函数参数定义为参数个数可变的形式,称为变长参数。注意变...

网友评论

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

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