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;
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;- ngx_array
- ngx_array可变数组
- Nginx源码完全注释(2)ngx_array.h / ngx_array.c
- 默写nginx并逐句分析 - ngx_array
- nginx数组代码分析[ngx_array.c]
- Nginx源码分析 - 基础数据结构篇 - 数组结构 ngx_array.c
- nginx源码初读(5)--让烦恼从数据结构开始(ngx_array)
- 结构体
- JAVA 面向对象之 多态
- 二维数组行列互换
- Python 02:Python数据类型
- C++中的namespace
- ngx_array
- 冒泡排序
- Base64编码
- 快速体验MyCAT
- 判断回文
- 守护进程二三事与Supervisor
- 线段树专题#6_蒟蒻训练历程记录_HDU 2705 Billboard_单点更新
- 顺序查找法
- 剑指offer——从尾到头打印链表