Nginx基础数据结构分析-ngx_array_t

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

ngx_array_t结构的定义如下:

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

销毁该数组对象,并释放其对应的内存给对应的内存池。需要注意的是,调用该函数以后,数组对象上个字段的值并没有被清零。所以即便这个时候对象a上各字段还有有意义的值,但是这个对象绝对不应该被再使用了,除非是使用ngx_array_init函数。

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销毁以后,如果想再次使用,就可以调用此函数。

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

注意事项:

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

转载自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=686647&id=3390549

时间: 2024-12-31 10:42:05

Nginx基础数据结构分析-ngx_array_t的相关文章

Nginx基础数据结构分析-ngx_hash_keys_arrays_t

大家看到在构建一个ngx_hash_wildcard_t的时候,需要对通配符的哪些key进行预处理.这个处理起来比较麻烦.而当有一组key,这些里面既有无通配符的key,也有包含通配符的key的时候.我们就需要构建三个hash表,一个包含普通的key的hash表,一个包含前向通配符的hash表,一个包含后向通配符的hash表(或者也可以把这三个hash表组合成一个ngx_hash_combined_t).在这种情况下,为了让大家方便的构造这些hash表,nginx提供给了此辅助类型. 该类型以及

Nginx基础数据结构分析-ngx_buf_t

这个ngx_buf_t就是这个ngx_chain_t链表的每个节点的实际数据.该结构实际上是一种抽象的数据结构,它代表某种具体的数据.这个数据可能是指向内存中的某个缓冲区,也可能指向一个文件的某一部分,也可能是一些纯元数据(元数据的作用在于指示这个链表的读取者对读取的数据进行不同的处理). 该数据结构位于src/core/ngx_buf.h|c文件中.我们来看一下它的定义. struct ngx_buf_s { u_char *pos; u_char *last; off_t file_pos;

Nginx基础数据结构分析-ngx_list_t

ngx_list_t顾名思义,看起来好像是一个list的数据结构.这样的说法,算对也不算对.因为它符合list类型数据结构的一些特点,比如可以添加元素,实现自增长,不会像数组类型的数据结构,受到初始设定的数组容量的限制,并且它跟我们常见的list型数据结构也是一样的,内部实现使用了一个链表. 那么它跟我们常见的链表实现的list有什么不同呢?不同点就在于它的节点,它的节点不像我们常见的list的节点,只能存放一个元素,ngx_list_t的节点实际上是一个固定大小的数组. 在初始化的时候,我们需

[喵咪软件推荐(1)]全球化地址基础数据

[喵咪软件推荐(1)]全球化地址基础数据 前言 哈喽大家好啊!今天又来刨坑了,这次给大家带来的是软件推荐系列,主要是把一些特别好用的一些软件推荐给大家并且分析使用场景以及用法,今天要给大家介绍的一个类软件呢,主要是解决全球化地址这类问题,那么话不多说进入今天的正片环节. 附上: 喵了个咪的博客:w-blog.cn 全球国家信息国旗以及经纬度范围:https://github.com/mledoze/countries 全球国家各语言名称:https://github.com/umpirsky/c

如何做到ERP基础数据的整理?

参与过ERP项目实施的人都应该知道,ERP项目实施能够成功,关键在于细节.有人这样说,ERP不难,只是很繁.这里所说的繁,指的就是整理ERP基础数据的过程.整理ERP基础数据的确很繁琐,这个过程并不比ERP上线轻松,但它并不难,只要坚持,就一定能够实现.ERP项目实施成功靠的是三分技术,七分管理,十二分数据.可见,ERP系统中基础数据整理的重要性. ERP系统中共有三大数据源,分别为工程数据源,库存数据源和其它各项参数的设置.其中,工程数据源和库存数据源占据了整个ERP系统数据库的90%,它们的

【原创】C#搭建足球赛事资料库与预测平台(3) 基础数据表设计

        本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html  开源C#彩票数据资料库系列文章总目录:http://www.cnblogs.com/asxinyu/p/4329642.html  本篇文章开始将逐步介绍使用C#搭建足球赛事资料库与预测平台的相关细节.还是先从数据库开始,从本文开始将逐步对每个核心实体类和数据库设计相关的内容进行讲解,并公布源代码,至于能不能跑起来,看的看个人努力.数据库很庞大,且采用了XCo

电影 影院 影片 信息-电影 APP 基础数据接口 API

问题描述 电影 APP 基础数据接口 API 目前公司想做一个电影APP,与影院的交易接口API有了.但是他们没有基础数据的API (影院详细信息.影片详细信息),他们交易就只有影院.影片的编码+名称交易. 想咨询网上的大牛,怎么获取这些影院.影片的详细基础信息,还有即将上映的电影信息.其他电影购买平台都是怎么做这些基础数据的? 解决方案 1.如果API里没有,看数据库里是否有,如果有的话,可以从数据库中抓取 2.从网上找相关的信息,手工录入系统中

互联网金融-最近股市板块轮动明显,想开发一款主题投资工具,缺少基础数据,请问如何获取主题资讯数据?

问题描述 最近股市板块轮动明显,想开发一款主题投资工具,缺少基础数据,请问如何获取主题资讯数据? 想开发主题投资工具 目前沪指大幅震荡板块轮动明显,想开发一款主题投资工具,为股民把握市场风格变幻助力: 1.通过新闻资讯和市场行情,自动挖掘->发现->推荐 新主题和热点主题 2. 自动关联主题板块,所对应的成分股 3.辅以关联分析.回测计算等运算快速获最新主题及其关联股票的涨幅收益概览 遇到的困难 目前 媒体.微博.贴吧等等最新资讯的获取,以及主题关键词抽取.内容聚合等大数据挖掘,分析,计算等等

Nginx基础知识、安装及调试

编写此技术指南在于推广普及NGINX在国内的使用,更方便的帮助大家了解和掌握NGINX的一些使用技巧.本指南很多技巧来自于网络和工作中或网络上朋友们问我的问题.在此对网络上愿意分享的朋友们表示感谢和致意!欢迎大家和我一起丰富本技术指南提出更好的建议! Nginx http://www.aliyun.com/zixun/aggregation/22929.html">基础知识 1.简介 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,