nginx的数组
nginx数组的实现在ngx_array.h 和 ngx_array.c文件中
nginx数组定义
typedef uintptr_t ngx_uint_t;
typedef struct {
void *elts; //数组的起始地址
ngx_uint_t nelts; // 个数
size_t size; //每个元素的大小
ngx_uint_t nalloc; // 容量
ngx_pool_t *pool; //内存池
} ngx_array_t;
数组的接口
static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)
ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);
void ngx_array_destroy(ngx_array_t *a);
void *ngx_array_push(ngx_array_t *a);
void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n);
接口说明
ngx_array_init函数
功能说明: 用来初始化数组
参数 | 意义 |
---|
array | 要初始化的数组指针 |
pool | 数组使用的内存池 |
n | 初始化要申请的数组元素数量 |
size | 一个数组元素的大小 |
ngx_array_create函数
功能说明: 用来创建一个数组,使用内存池申请一个array,然后调用ngx_array_init函数实现
参数 | 意义 |
---|
p | 数组使用的内存池 |
n | 初始化要申请的数组元素数量 |
size | 一个数组元素的大小 |
ngx_array_destroy函数
功能说明: 用来销毁一个数组,这里并不是真正的释放内存空间,只是标记了内存池的内存可以再次被使用
ngx_array_push函数
功能说明: 向数组中添加元素
先判断数组申请的空间是否用完,如果已经耗尽,那么需要申请内存,
申请内存的过程:
每次数组需要的空间是一个元素的大小
先判断内存池中是否有足够内存,如果内存充足,修改内存池的已用内存边界,修改数组容量直接对数组扩容
如果内存池内存不够,内存池接口从系统申请内存大小为数组容量的2倍
元素个数加一,返回最后一个元素指向的内存
返回最后一个元素的内存地址
ngx_array_push_n
功能说明:向数组后面追加n个数组元素
先判断数组申请的空间是否用完,如果已经耗尽,那么需要申请内存,
申请内存的过程:
每次数组需要的空间是n个元素的大小
先判断内存池中是否有足够内存,如果内存充足,修改内存池的已用内存边界,修改数组容量直接对数组扩容
如果内存池内存不够,内存池接口从系统申请内存大小为数组容量的2倍,如果n大于数组容量,则扩充的大小为2n个数组元素的容量
元素个数加n,返回要追加的n个元素在数组中位置的起始地址
返回要追加的n个元素在数组中位置的起始地址