对于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的分析,还需更加努力,参透代码,领悟精华!