nginx中的ngx_array_t类似于c语言中的数组,其是基于内存池动态分配的。主要包含在文件src/core/ngx_array.h和/src/core/ngx_array.c两个文件中。

1、ngx_array_t的数组结构

typedef struct {void        *elts;       //数组的首地址ngx_uint_t   nelts;     //数组中的实际占用的元素个数size_t       size;       //每个元素的大小ngx_uint_t   nalloc;   //数组的总容量ngx_pool_t  *pool;      //内存池
} ngx_array_t;

2、数组的操作

数组的操作主要有5个

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);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_create来完成。首先在内存池中分配数组头,再分配数组区。

ngx_array_t *
ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size)
{ngx_array_t *a;a = ngx_palloc(p, sizeof(ngx_array_t));        //内存池中分配数组头if (a == NULL) {return NULL;}if (ngx_array_init(a, p, n, size) != NGX_OK) {           //分配数组区数据return NULL;}return a;
}

数组的销毁

是由ngx_array_destroy来完成,修改内存池中数组区的last指针

void
ngx_array_destroy(ngx_array_t *a)
{ngx_pool_t  *p;p = a->pool;//修改last指针,销毁数组的数组区if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {   p->d.last -= a->size * a->nalloc;}//修改lastr指针,销毁数组头if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {p->d.last = (u_char *) a;}
}

数组中添加元素

由函数ngx_array_push和ngx_array_push_n来完成,ngx_array_push是添加一个元素,ngx_array_push_n是添加n个元素。两个函数原来差不多,下面只是以添加一个元素为例。

void *
ngx_array_push(ngx_array_t *a)
{void        *elt, *new;size_t       size;ngx_pool_t  *p;if (a->nelts == a->nalloc) {   //数组已满/* the array is full */size = a->size * a->nalloc;p = a->pool;if ((u_char *) a->elts + size == p->d.last&& p->d.last + a->size <= p->d.end)   //内存池中可以继续分配,直接修改last指针{/** the array allocation is the last in the pool* and there is space for new allocation*/p->d.last += a->size;a->nalloc++;} else {/* allocate a new array */new = ngx_palloc(p, 2 * size);  //内存池中分配2倍数组大小的空间if (new == NULL) {return NULL;}ngx_memcpy(new, a->elts, size);   //将原来的数组区数组拷贝到新分配的空间内a->elts = new;a->nalloc *= 2;}}elt = (u_char *) a->elts + a->size * a->nelts; //数组中实际元素中最后一个元素地址的末尾a->nelts++;return elt;
}

小结

本方主要对ngx中的数组结构ngx_array_t作了分析,包括其数组结构、数组的创建、销毁、添加元素。

nginx中的数组结构ngx_array_t相关推荐

  1. 输出php数组结构,在PHP中输出数组结构使用 函数 。

    在PHP中输出数组结构使用 函数 . 更多相关问题 南京长江第三大桥是什么时候通车的?() 抗爆性可以判断汽油在发动机中燃烧是否易于发生不正常的(). 道岔尖轨.心轨.基本轨的爬行.窜动量不得超()m ...

  2. nginx源码分析—数组结构ngx_array_t

    Content 0. 序 1. 数组结构 1.1 ngx_array_t结构 1.2 ngx_array_t的逻辑结构 2. 数组操作 2.1 创建数组 2.2 销毁数组 2.3 添加1个元素 3.  ...

  3. python 结构体数组 定义_一篇文章弄懂Python中所有数组数据类型

    前言 数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种"数组"类型的实现. list tuple array.array str bytes bytearr ...

  4. 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明...

    [VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...

  5. 中的数组怎么转成结构体_PLC知识,什么是数组和结构体?

    今天给大家介绍一下什么是数组,什么是结构体,关于数组我们会介绍数组的定义.它的使用方法,关于结构体我们会介绍结构体的使用.怎么去建立一个结构体等知识,之前也是有部分学员有问过这些问题的,那么都一块儿给 ...

  6. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

  7. matlab向结构体中的数组自动赋值_数组 – 在Matlab结构体数组的每个元素中更新一个字段...

    只是一个说明,交易是不必要的: [arr.val] = newVals{:}; % achieves the same as deal(newVals{:}) 唯一的其他方式我知道如何做(没有foor ...

  8. nginx的hash表结构

    前言 ngx中的hash表有两种,一种是常规的hash表,另外一种是带有通配符的hash表(其中包含前缀通配符和后经通配符).而带通配符的hash表是基于常规hash表建立的. ngx_hash_t是 ...

  9. Nginx学习之三-ngx_http_request_t结构体

    ngx_http_request_s是nginx中非常重要的一个结构体,贯穿于htpp请求处理的整个过程中. 下面解释了ngx_http_request_s结构体中与HTTP框架相关的重要的成员变量. ...

最新文章

  1. 生产异常反馈流程图_企业生产现场管理做到这些,想不成功都难
  2. T-SQL IN 谓词
  3. P3743 kotori的设备(二分答案,思维,线性)难度⭐⭐⭐
  4. 单臂路由与三层交换机实现VLAN通信
  5. 借助Spring站点开始一个spring项目
  6. JAVA中Final的用法
  7. opencv轻松入门面向python下载_OpenCV轻松入门:面向Python
  8. PHP将多个文件中的内容合并为新的文件
  9. html的canvas标签用法,html5中关于canvas标签用法(绘图)
  10. SpringBoot 解决“不支持发行版本xx”的问题
  11. Python爬虫实战(二):爬取快代理构建代理IP池
  12. 分享110个ASP源码,有一款适合你
  13. 【语音定时播报系统】基于树莓派+百度语音合成打造语音定时播报系统
  14. Win7旗舰版 安装步骤
  15. 桌面级显卡天梯图(显卡性能对比图.2018.11)
  16. 哪里可以买到苹果手机原装电池?
  17. python 筛选重复数据和不重复数据_[Python] Pandas 对数据进行查找、替换、筛选、排序、重复值和缺失值处理...
  18. linux排行榜网站,DistroWatch网站搞的Linux国际排名为它赢得了不少的流量
  19. 用Python制作恋爱日志
  20. MIPS指令集处理器设计(支持64条汇编指令)

热门文章

  1. PHP 连接 MSSQL用port时候的注意事项
  2. 克服游戏运营中IB的长尾挑战
  3. Log4Net使用详解(续)
  4. Visual Studio 2010 模板缺失
  5. python爬虫如何从一个页面进入另一个页面-Python爬虫 (一):爬取一个简单的静态网页...
  6. python中类方法与实例方法的区别-python中类方法,实例方法,静态方法的作用和区别...
  7. 前端学python有什么用-原来 Python 还有这些实用的功能和特点!
  8. python快速编程入门教程-半小时带你快速入门Python编程,Python快速入门教程
  9. python处理excel表格大小-如何用python处理excel表格
  10. python软件界面-用Python写一个语音播放软件