您的位置:首页 > 运维架构 > Nginx

nginx之动态数组

2016-07-02 15:32 591 查看
数组
struct ngx_array_s {

    void        *elts;                  //指向实际的数据存储区域;

    ngx_uint_t   nelts;          //数组实际元素个数。

    size_t       size;              //数组单个元素的大小,单位是字节。

    ngx_uint_t   nalloc;      //数组的容量。

    ngx_pool_t  *pool;       //该数组用来分配内存的内存池。

};

下面分别说明各字段的含义:

nalloc: 数组的容量。表示该数组在不引发扩容的前提下,可以最多存储的元素的个数。当nelts增长到达nalloc 时,如果再往此数组中存储元素,则会引发数组的扩容。数组的容量将会扩展到原有容量的2倍大小。实际上是分配新的一块内存,新的一块内存的大小是原有内存大小的2倍。原有的数据会被拷贝到新的一块内存中。

//创建指针,并调用ngx_array_init分配内存

/**

* 初始化一个数组

* p:内存池容器

* n:支持多少个数组元素

* size:每个元素的大小

*/

ngx_array_t*ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);

//已创建ngx_array_t结构体时,创建数组

static inline int ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size);

//销毁数组

voidngx_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);

 

//初始化数组

staticngx_inline ngx_int_t
ngx_array_init(ngx_array_t*array, ngx_pool_t *pool, ngx_uint_t n, size_t size)

例子:

   typedef struct

   {    

       u_char *name;    

       int age;

   }Student;

    

   ngx_array_t* pArray = ngx_array_create(cf->pool,1,sizeof(Student));

   Student *pStudent = ngx_array_push(pArray);

   pStudent->age = 10;

 

   Students *pStudents  = ngx_array_push_n(pArray,3);

   pStudents->age = 1;

   (pStudents  + 1 )->age =2;

   (pStudents  + 2 )->age = 3;

    

   //遍历

   Student *pStudent = pArray->elts;

   ngx_uint_i = 0;

   for(; i < pArray->nelts;i++)

   {

       a = pStudent  + i;

       //....

   }

不create也可以,例如:

    struct stream_info_s {

        u_char     *pos;

        ngx_int_t   args;

    } streams[4], *s;

    ngx_array_t     stream;

    stream.nelts = 0;

    stream.elts = &streams;

    stream.size = sizeof(struct stream_info_s);

    stream.nalloc = 4;

    stream.pool = r->pool;

    //添加

    s = ngx_array_push(&stream);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: