NGINX(1.3.7)代码学习: 动态数组

动态数组结构: 

struct ngx_array_s {
    void        *elts;                    //数组起始地址
    ngx_uint_t   nelts;            //已经使用的个数
    size_t       size;                 //每个数据的大小, 即数组元素的大小
    ngx_uint_t   nalloc;         //已经分配的数组大小
    ngx_pool_t  *pool;         //内存池, elts的内存是从内存池中提取出来的, 在这里为了
};



创建数组

ngx_array_t *
ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size)
{
    ngx_array_t *a;

    a = ngx_palloc(p, sizeof(ngx_array_t));  //创建数组头

    if (a == NULL)
    {
        return NULL;
    }

    a->elts = ngx_palloc(p, n * size);  //从pool中分配数组的内存

    if (a->elts == NULL)
    {
        return NULL;
    }

    a->nelts = 0;   //置已使用数为0
    a->size = size; //数组元素大小
    a->nalloc = n;  //数组元素个数
    a->pool = p;   

    return a;
}


销毁数组:

销毁数组比较简单, 置pool中的pool->d.last位置,将数组的内存回收到pool中。

void
ngx_array_destroy(ngx_array_t *a)
{
    ngx_pool_t  *p;

    p = a->pool;

    //先收回数组部分
    if ((u_char *) a->elts + a->size * a->nalloc == p->d.last)
    {
        p->d.last -= a->size * a->nalloc;
    }
    
   //收回数组头
    if ((u_char *) a + sizeof(ngx_array_t) == p->d.last)
    {
        p->d.last = (u_char *) a;
    }
}


使用数组:

ngx_array_push 和 ngx_array_push_n

如果数组已已满, 看看pool中是否还有空间;还有就扩大一个; 如果pool也不够用了, 则分配新的pool; 并且申请数组为原来的两倍。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值