ngx_array

来源:互联网 发布:ubuntu怎么更新 编辑:程序博客网 时间:2024/06/06 08:51


数组:

 在程序中,咱们经常使用到一组相同类型的数据,这个时候一般都是使用数组来保存, 比如 int arr[10] ={0}; int * arr = (int *)calloc(sizeof(int) * 10 ,1); 然后直接操作。

 但是这样有个不好的地方 如果数目不定 一直就加减,好像就要写额外操作了。所以咱们来看下 nginx是怎么玩的数组。


首先还是来看数据结构:

typedef struct {

    void        *elts;//数据存储区域

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

    size_t       size; //元素的大小

    ngx_uint_t   nalloc;//数组当前可以容纳的数目

    ngx_pool_t  *pool;  //内存池

} ngx_array_t;


数据结构的定义上很清晰 没有什么黑科技的变量。

来看下操作的函数:
 创建一个array

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

 p  内存池 ,n 数目  ,size 元素的大小。

流程就是分配一个ngx_array_t 大小的空间, 然后初始化ngx_array_t里面的数据赋值下。


追加元素:

void *ngx_array_push(ngx_array_t *a);

返回一个 元素的存储空间。


流程就是,先判断还有没有空间,然后没有空间就进行扩容,然后又足够的空间,就返回内存。 在处理扩容的时候 如果当当前使用的内存是内存池的根节点,当前的数组内存的结束位置和内存的下次分配位置一致(就是当前内存池就给他自己分配的内存),并且还有足够的空间, 这个时候就只进行一个size的扩容。

需要注意的是,如果进行两倍扩容的话,前一个内存空间不会被释放,这样会造成内存的浪费,所以使用的时候要合理的设置n的大小。

void *ngx_array_push_n(ngx_array_t *a,ngx_uint_t n);

返回n个元素,操作上没有区别。


void ngx_array_destroy(ngx_array_t *a);

其实这个函数没有做什么实质性的操作,就判断了下数组的空间能否归还和 ngx_array_t的内存是否可以归还给pool;





0 0
原创粉丝点击