7.3.2 动态数组的使用方法
ngx_array_t动态数组的实现仅使用1个结构体,如下所示。
typedef struct ngx_array_s ngx_array_t;
struct ngx_array_s{
//elts指向数组的首地址
void
*elts;
//nelts是数组中已经使用的元素个数
ngx_uint_t nelts;
//每个数组元素占用的内存大小
size_t
size;
//当前数组中能够容纳元素个数的总大小
ngx_uint_t nalloc;
//内存池对象
ngx_pool_t*pool;
};
在上面这段代码中已经简单描述了ngx_array_t结构体中各成员的意义,通过图7-5,读者可以有更直观的理解。
从图7-5中可以看出,ngx_array_t动态数组还提供了5个基本方法,它们的意义见表7-3。
图 7-5 ngx_array_t动态数组结构体中的成员及其提供的方法
如果使用已经定义过的ngx_array_t结构体,那么可以先调用ngx_array_init方法初始化动态数组。如果要重新在内存池上定义ngx_array_t结构体,则可以调用ngx_array_create方法创建动态数组。这两个方法都会预分配一定容量的数组元素。
在向动态数组中添加新元素时,最好调用ngx_array_push或者ngx_array_push_n方法,这两个方法会在达到数组预分配容量上限时自动扩容,这比直接操作ngx_array_t结构体中的成员要好得多,具体将在7.3.3节的例子中详细说明。
注意 因为ngx_array_destroy是在内存池中销毁动态数组及其分配的元素内存的(如果动态数组的ngx_array_t结构体内存是利用栈等非内存池方式分配,那么调用ngx_array_destroy会导致不可预估的错误),所以它必须与ngx_array_create配对使用。