ngx_array_s数组分析(三)
来源:互联网 发布:单词社交网络 下载 编辑:程序博客网 时间:2024/06/07 09:53
一、定义
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数组分析(三)
- ngnix源码分析----ngx_array_s 内存数组
- 数组转List-典型代码缺陷分析(三)
- 数组(三)
- 数组分析
- 数组分析
- 1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式
- Java学习系列(三)Java运算符、控制语句、数组及其在内存中的运行分析
- Java学习系列(三)Java运算符、控制语句、数组及其在内存中的运行分析
- JavaScript清空数组的三种方法及效率分析
- 三:数组_遍历数组
- 三:数组_PHP全局数组
- 数组(三)--打印数组
- C++/CLI(三):数组
- 数组笔记(三)
- 折腾二维数组【三】
- Numpy 数组创建 (三)
- (三)字符串、向量、数组
- 查找配置文件,并返回文件的绝对路径
- 推荐一个Java缓存框架
- Android 连接网络时显示进度条
- 在旋转后的有序数组中查找元素,要求O(logn)的时间复杂度
- jsp servlet 验证码
- ngx_array_s数组分析(三)
- JSP架构、JSP开发工具优缺点比较
- [2010/09/29]爱护牙齿Take Care of Your Teeth
- android应用客户端自动升级
- test
- test
- Treasure Hunting 分解质因子
- PhysX API 初览
- bb