概述
一、定义
ngx_array_s是一维的数据结构,在内存中内存空间是连续的。
struct ngx_array_s {
void *elts; --数组首个元素地址
ngx_uint_t nelts; --数组中已有元素个数
size_t size; --数组每个元素大小(字节)
ngx_uint_t nalloc; --数组容量
ngx_pool_t *pool; --内存池
};
二、定义的办法
ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size); --从内存池中创建n个元素的数组,元素大小为size
void ngx_array_destroy(ngx_array_t *a); ---把数组分配到的内存释放到内存池
void *ngx_array_push(ngx_array_t *a); --返回将要添加到数组中元素的地址,如果数组已满,则重新分配两倍(nalloc*size)的内存空间,且nalloc更新为2*nalloc
void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n); --返回将要添加n个元素到数组中其首个元素的地址
三、代码分析
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)); --分配ngx_array_t数组管理结构
if (a == NULL) {
return NULL;
}
a->elts = ngx_palloc(p, n * size); --分配n*size内存
if (a->elts == NULL) {
return NULL;
}
a->nelts = 0;
a->size = size; --元素大小
a->nalloc = n; --数组容量
a->pool = p;
return a;
}
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;
}
}
void *
ngx_array_push(ngx_array_t *a)
{
void *elt, *new;
size_t size;
ngx_pool_t *p;
if (a->nelts == a->nalloc) {
/* the array is full */
size = a->size * a->nalloc;
p = a->pool;
if ((u_char *) a->elts + size == p->d.last
&& p->d.last + a->size <= p->d.end)
{
/*
* the array allocation is the last in the pool
* and there is space for new allocation
*/
p->d.last += a->size;
a->nalloc++;
} else {
/* allocate a new array */
--分配两倍空间
new = ngx_palloc(p, 2 * size);
if (new == NULL) {
return NULL;
}
ngx_memcpy(new, a->elts, size);
a->elts = new;
a->nalloc *= 2; --分配容量增加一倍
}
}
elt = (u_char *) a->elts + a->size * a->nelts;
a->nelts++;
return elt;
}
void *
ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
{
void *elt, *new;
size_t size;
ngx_uint_t nalloc;
ngx_pool_t *p;
size = n * a->size;
if (a->nelts + n > a->nalloc) {
/* the array is full */
p = a->pool;
if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
&& p->d.last + size <= p->d.end)
{
/*
* the array allocation is the last in the pool
* and there is space for new allocation
*/
p->d.last += size;
a->nalloc += n;
} else {
/* allocate a new array */
nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
new = ngx_palloc(p, nalloc * a->size);
if (new == NULL) {
return NULL;
}
ngx_memcpy(new, a->elts, a->nelts * a->size);
a->elts = new;
a->nalloc = nalloc;
}
}
elt = (u_char *) a->elts + a->size * a->nelts;
a->nelts += n;
return elt;
}
最后
以上就是俊秀百褶裙为你收集整理的ngx_array_s数组分析(三)的全部内容,希望文章能够帮你解决ngx_array_s数组分析(三)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复