對於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的分析,還需更加努力,參透代碼,領悟精華!