数组的结构体定义:
<code><span>typedef</span><span>struct</span> ngx_array_s ngx_array_t; <span>struct</span> ngx_array_s { <span>void</span> *elts; <span>// 指向数组存储位置的首地址</span> ngx_uint_t nelts; <span>// 当前数组中已经存放的元素个数</span> size_t size; <span>// 数组中每个元素的大小</span> ngx_uint_t nalloc; <span>// 当前最多能容纳的元素个数,类似cpp中的Vector,当nelts大于nalloc时扩容</span> ngx_pool_t *pool; <span>// 该数组对应的内存池</span> };</code>
下面介绍数组操作函数:
<code>ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size); <span>/* 从pool中申请array结构体内存,并调用init初始化(申请n*size内存,改变array内的属性), * 所以元素与结构体内存可能并不连续,但肯定在同一个pool里,失败返回NULL */</span><span>void</span> ngx_array_destroy(ngx_array_t *a); <span>/* 依次销毁数组的数据区和结构体内存,将内存返还给pool(last-=) * if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) { p->d.last = (u_char *) a; } * 销毁结构体的代码如上,因为这代码看起来很奇怪,它怎么知道数组肯定再pool的最后,没加过其他东西了? 看了源码数组也并不是通过单独的pool来管理的,也就是说pool中还可能有很多其他的数据。 在nginx整个代码中没有找到对ngx_array_destroy的引用 */</span><span>void</span> *ngx_array_push(ngx_array_t *a); <span>void</span> *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n); <span>/* 在数组a上新追加元素,并返回指向新元素的指针。需要把返回的指针转换为具体类型, 然后再给新元素本身或者是各字段(如果数组的元素是复杂类型)赋值。*/</span><span>static</span> ngx_inline ngx_int_t ngx_array_init(ngx_array_t *<span>array</span>, ngx_pool_t *pool, ngx_uint_t n, size_t size) <span>/* 如果一个数组对象是被分配在堆上的,那么当调用ngx_array_destroy销毁以后,如果想再次使用,就可以调用此函数。 如果一个数组对象是被分配在栈上的,那么就需要调用此函数,进行初始化的工作以后,才可以使用。*/</span></code>
从以上代码中大家有没有发现一个很严肃的问题,不管是destroy还是扩容,源码中原来的内存位置都是没有free的,这样肯定造成了内存的浪费,nginx作者这么计较内存为什么会有这种问题呢,真心不理解,感觉很容易解决啊。不过肯定有理由把,我们在使用的时候最好提前规划好数组的大小,避免多次扩容造成的浪费。
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });以上就介绍了nginx源码初读(5)--让烦恼从main开始ngx_array,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

使用Java的File.length()函数获取文件的大小文件大小是在处理文件操作时很常见的一个需求,Java提供了一个很方便的方法来获取文件的大小,即使用File类的length()方法。本文将介绍如何使用该方法来获取文件的大小,并给出相应的代码示例。首先,我们需要创建一个File对象来表示我们想要获取大小的文件。以下是创建File对象的方法:Filef

标题:C#中使用Array.Sort函数对数组进行排序的示例正文:在C#中,数组是一种常用的数据结构,经常需要对数组进行排序操作。C#提供了Array类,其中有Sort方法可以方便地对数组进行排序。本文将演示如何使用C#中的Array.Sort函数对数组进行排序,并提供具体的代码示例。首先,我们需要了解一下Array.Sort函数的基本用法。Array.So

在进行PHP编程时,我们常常需要对数组进行合并。PHP提供了array_merge()函数来完成数组合并的工作,不过当数组中存在相同的键时,该函数会覆盖原有的值。为了解决这个问题,PHP在语言中还提供了一个array_merge_recursive()函数,该函数可以合并数组并保留相同键的值,使得程序的设计变得更加灵活。array_merge

在PHP中,有许多强大的数组函数可以使数组的操作更加方便和快捷。当我们需要将两个数组拼成一个关联数组时,可以使用PHP的array_combine函数来实现这一操作。这个函数实际上是用来将一个数组的键作为另一个数组的值,合并成一个新的关联数组。接下来,我们将会讲解如何使用PHP中的array_combine函数将两个数组拼成关联数组。了解array_comb

标题:使用TreeSet类的size()方法获取树集合中的元素数量引言TreeSet是Java集合框架中的一种有序集合,它实现了SortedSet接口,使用红黑树数据结构来实现。TreeSet可以按照元素的自然顺序进行排序,或者通过Comparator自定义比较器来进行排序。本文将介绍如何使用TreeSet类的size()方法来获取树集合中的元素数量,并提供

在PHP编程中,数组是一种非常重要的数据结构,能够轻松地处理大量数据。PHP中提供了许多数组相关的函数,array_fill()就是其中之一。本篇文章将详细介绍array_fill()函数的用法,以及在实际应用中的一些技巧。一、array_fill()函数概述array_fill()函数的作用是创建一个指定长度的、由相同的值组成的数组。具体来说,该函数的语法

Python中的array模块是一个预定义的数组,因此其在内存中占用的空间比标准列表小得多,同时也可以执行快速的元素级别操作,例如添加、删除、索引和切片等操作。此外,数组中的所有元素都是同一种类型,因此可以使用数组提供的高效数值运算函数,例如计算平均值、最大值和最小值等。另外,array模块还支持将数组对象直接写入和读取到二进制文件中,这使得在处理大量数值数据时更加高效。因此,如果您需要处理大量同质数据,可以考虑使用Python的array模块来优化代码的执行效率。要使用array模块,首先需要

在Java编程中,数组是一种重要的数据结构。数组可以在一个变量中存储多个值,更重要的是可以使用索引访问每个值。但是在使用数组时,可能会出现一些异常,其中之一是ArrayStoreException。本文将讨论ArrayStoreException异常的常见原因。1.类型不匹配数组在创建时必须指定元素类型。当我们试图将不兼容的数据类型存储到一个数组中时,就会抛


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Dreamweaver Mac版
视觉化网页开发工具