nginx源码那些事之array结构分析

        对于nginx来说,包含很多结构体,array便是其中之一。

       array结构体声明如下:

   struct ngx_array_s {
    void        *elts;  //分配元素首地址
    ngx_uint_t   nelts;//当前使用数
    size_t       size;//分配元素大小
    ngx_uint_t   nalloc;//分配数
    ngx_pool_t  *pool;//指向分配内存池
    };

      array结构包含几个重要的函数:

       对于ngx_array_create()函数,函数参数中没有array对象的指针。这个函数在内存池中创建一个array对象,并且分配n个元素,元素大小为size

   对于函数ngx_array_push(),比较重要的是如下代码:

  if ((u_char *) a->elts + size == p->d.last
            && p->d.last + a->size <= p->d.end)//如果插入一个成员后,pool的last值没超过end,进行分配,并设置相应的参数
        {
            p->d.last += a->size;
            a->nalloc++;

        } else {  //如果last值超过end值,则在pool上重新分配array,大小为原大小的2倍
            new = ngx_palloc(p, 2 * size);
            if (new == NULL) {
                return NULL;
            }

            ngx_memcpy(new, a->elts, size);
            a->elts = new;
            a->nalloc *= 2;
        }

    ngx_array_push()函数,将array对象当作堆栈,作压栈处理。如果当前内存池没有空闲空间可用,就会申请新的内存池并且创建一个是原来array对象两倍大小的新array,原array对象中的元素复制到新array中。

   ngx_array_push_n()函数,与ngx_array_push()函数功能类似。ngx_array_push_n()是压n个元素,ngx_array_push()压入一个元素。

    以上就是对array的分析,还需更加努力,参透代码,领悟精华!


 

你可能感兴趣的:(nginx,struct,null)