ngx_array_t是nginx内部使用的数组结构。nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性,比如实际上存储数据的区域也是一大块连续的内存。但是数组除了存储数据的内存以外还包含一些元信息来描述相关的一些信息。下面我们从数组的定义上来详细的了解一下。ngx_array_t的定义位于src/core/ngx_array.c|h里面。

typedef struct ngx_array_s       ngx_array_t;
struct ngx_array_s {void        *elts;ngx_uint_t   nelts;size_t       size;ngx_uint_t   nalloc;ngx_pool_t  *pool;
};
elts: 指向实际的数据存储区域。
nelts: 数组实际元素个数。
size: 数组单个元素的大小,单位是字节。
nalloc: 数组的容量。表示该数组在不引发扩容的前提下,可以最多存储的元素的个数。当nelts增长到达nalloc 时,如果再往此数组中存储元素,则会引发数组的扩容。数组的容量将会扩展到原有容量的2倍大小。实际上是分配新的一块内存,新的一块内存的大小是原有内存大小的2倍。原有的数据会被拷贝到新的一块内存中。
pool: 该数组用来分配内存的内存池。

下面介绍ngx_array_t相关操作函数。

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

创建一个新的数组对象,并返回这个对象。

p: 数组分配内存使用的内存池;
n: 数组的初始容量大小,即可以在不扩容的情况下最多可以容纳的元素个数。
size: 单个元素的大小,单位是字节。
void ngx_array_destroy(ngx_array_t *a);

销毁该数组对象,并释放其分配的内存回内存池。

void *ngx_array_push(ngx_array_t *a);

在数组a上新追加一个元素,并返回指向新元素的指针。需要把返回的指针使用类型转换,转换为具体的类型,然后再给新元素本身或者是各字段(如果数组的元素是复杂类型)赋值。

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

在数组a上追加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_destroy销毁以后,如果想再次使用,就可以调用此函数。

如果一个数组对象是被分配在栈上的,那么就需要调用此函数,进行初始化的工作以后,才可以使用。

注意事项: 数组在扩容时,旧的内存不会被释放,会造成内存的浪费。因此,最好能提前规划好数组的容量,在创建或者初始化的时候一次搞定,避免多次扩容,造成内存浪费。

Nginx基本数据结构之ngx_array_t相关推荐

  1. Nginx学习笔记(三) Nginx基本数据结构

    话说学习一种编程语言,例如C语言,我们首先学的也是数据结构,这是以后开发程序的关键.为了更好更方便的开发Nginx,Nginx自己实现了很多适合nginx的数据结构. Nginx中的数组 ngx_ar ...

  2. Nginx基本数据结构之ngx_hash_keys_arrays_t

    大家看到在构建一个ngx_hash_wildcard_t的时候,需要对通配符的哪些key进行预处理.这个处理起来比较麻烦.而当有一组key,这些里面既有无通配符的key,也有包含通配符的key的时候. ...

  3. nginx基本数据结构ngx_module_t,ngx_module_s

    ngx_module_t是nginx的模块化架构最基本的数据结构.  其结构定义如下,其中的注释为功能说明: struct ngx_module_s { ngx_uint_t            c ...

  4. Nginx基本数据结构之ngx_buf_t

    这个ngx_buf_t就是这个ngx_chain_t链表的每个节点的实际数据.该结构实际上是一种抽象的数据结构,它代表某种具体的数据.这个数据可能是指向内存中的某个缓冲区,也可能指向一个文件的某一部分 ...

  5. Nginx基本数据结构之ngx_hash_t

    ngx_hash_t是nginx自己的hash表的实现.定义和实现位于src/core/ngx_hash.h|c中.ngx_hash_t的实现也与数据结构教课书上所描述的hash表的实现是大同小异.对 ...

  6. Nginx基本数据结构之ngx_pool_t

    ngx_pool_t是一个非常重要的数据结构,在很多重要的场合都有使用,很多重要的数据结构也都在使用它.那么它究竟是一个什么东西呢?简单的说,它提供了一种机制,帮助管理一系列的资源(如内存,文件等), ...

  7. Nginx基本数据结构之ngx_str_t

    nginx的作者为追求极致的高效,自己实现了很多颇具特色的nginx风格的数据结构以及公共函数.比如,nginx提供了带长度的字符串,根据编译器选项优化过的字符串拷贝函数ngx_copy等.所以,在我 ...

  8. nginx基本数据结构及接口

    简单的数据类型 在core/ngx_confing.h中定义了基本的数据类型的映射,大部分都映射到c语言自身的数据类型: typedef intptr_t        ngx_int_t; type ...

  9. Nginx基本数据结构之ngx_queue_t

    ngx_queue_t是nginx中的双向链表,在nginx源码目录src/core下面的ngx_queue.h|c里面.它的原型如下: typedef struct ngx_queue_s ngx_ ...

最新文章

  1. 新书上市|当我们讨论“量子计算”时我们在讨论什么?
  2. 外部表不是预期的格式_超详细的CMDB介绍--概念、架构、模型、表设计及开源选择...
  3. DNN:逻辑回归与 SoftMax 回归方法
  4. openresty 操作memcached例子
  5. 英特尔吃iPhone 7 Modem芯片订单可能逾5成 挹注15亿美元营收
  6. PostgreSQL归档配置及自动清理归档日志
  7. 机器学习中的混淆矩阵,准确率,精确率,召回率,F1,ROC/AUC,AP/MAP
  8. 卡巴斯基6.0离线升级包的制作和使用方法
  9. 各种风格的Android面试题进来了解一下,面试必问
  10. 微软“断臂求生”,能实现绝地反击吗?
  11. 地表反射率影响因素_【专题突破】影响气候形成的因素及主要气候判别(高中地理),务必掌握!...
  12. 成绩排序 九度OJ第2题
  13. 机房收费系统(一)可行性研究报告
  14. C# 时间日期的获取与比较
  15. vue中使用微信jssdk语音聊天功能
  16. 23.敏捷优秀实践 - 产品开发流程
  17. 学习Linux七(Linux必学60个命令之【系统管理】)
  18. 2020年元宵节健康
  19. [2008-05-26]我的梦
  20. 微信会员卡系统如何助力服装店提升业绩(下)

热门文章

  1. ajax文件后台提交,有关文件上传 非ajax提交 得到后台数据问题
  2. Java 算法 打水问题
  3. linux nohup后台执行管道操作
  4. matplotlib绘制箭头
  5. C语言读取raw格式图像,求指导,如何用c语言实现读取*.raw格式图像
  6. 利用计算机语言进行并行性描述,有没有一种语言可以利用大规模并行计算机?...
  7. linux 环境搭建Jenkins
  8. C#图解教程 第十八章 枚举器和迭代器
  9. RQNOJ36 数石子 并查集 简单应用
  10. html5下input的placeholder标签兼容ie9