nginx动态数组中自动扩容的实现问题

问题描述

nginx动态数组中自动扩容的实现问题

为了方便阐述我的问题,我举个例子:
ngx_array_t *manager = ngx_array_create( cf->pool,1,sizeof(Node) );

在ngx_array_create的实现中,将manager的成员pool置为cf->pool; 大家知道,如果cf->pool当前内存空间不够,就会再生成另一个内存节点,那么manager可能指向的是另一个内存池节点分配的内存;

继续,关于ngx_array_push自动扩容问题的实现(我不理解的地方);
下面是实现代码:
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) /*为什么认定当初分配的动态数组的数据区就是在cf->pool*/
    {
        /*
         * 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);
        if (new == NULL) {
            return NULL;
        }

        ngx_memcpy(new, a->elts, size);
        a->elts = new;
        a->nalloc *= 2;
    }
}
。。。

}

不好意思,我没有积分。。。

解决方案

pool里面本身也还都是指针吧,空间不够也还是在其他地方分配,然后修改指针。s所有还是用pool

时间: 2024-09-30 03:17:03

nginx动态数组中自动扩容的实现问题的相关文章

C#动态数组中重复项和ListView显示

问题描述 用C#加载RFID阅读器的APIDLL,并将数据在ListView中显示出来.我加载DLL后数据是读出来了,并且生成了由RFID标签ID号组成的以逗号分隔的字符串(strTmp),使用split分割后的数组string[]spStr=strTmp.Split(newchar[]{',']);,并且Add到ListView中也很顺利,RFID是循环读取的,如果数组中的元素在ListView中已经存在,则记录读取的次数并在ListView中显示出来,ListView中不存在则加入ListV

asp 得到动态数组中元素的个数_应用技巧

一个动态数组 a,如果你已经使用redim 语句给它设定了大小,那么在此之后使用 ubound(a) 就可以得到它的上边界. 如果你没有使用 redim 语句给它设定大小,直接使用 ubound(a) 函数,那么运行时会报错,并会中断程序的执行.我们恰恰利用这一点,可以知道这个数组还没有任何元素.于此同时,我们却不想程序中断执行,那么可以在 ubound(a) 函数执行前加上一句 复制代码 代码如下: on error resume next 把本功能写成一个函数 function get_el

asp 得到动态数组中元素的个数

一个动态数组 a,如果你已经使用redim 语句给它设定了大小,那么在此之后使用 ubound(a) 就可以得到它的上边界. 如果你没有使用 redim 语句给它设定大小,直接使用 ubound(a) 函数,那么运行时会报错,并会中断程序的执行.我们恰恰利用这一点,可以知道这个数组还没有任何元素.于此同时,我们却不想程序中断执行,那么可以在 ubound(a) 函数执行前加上一句 复制代码 代码如下: on error resume next 把本功能写成一个函数 function get_el

(教学思路 C#集合一)集合的概述、动态数组ArrayList

这一节我们来学习集合,什么是集合呢? 集合就如同数组,用来存储和管理一组特定类型的数据对象,除了基本的数据处理功能,集合直 接提供了各种数据结构及算法的实现,如队列.链表.排序等,可以让你轻易地完成复杂的数据操作.在使用数组和集合时要先加入 system.collections命名空间,它提供了支持各种类型集合的接口及类.集合本身上也是一种类型,基本上可以将其作为用来存储一组数据对 象的容器,由于c#面向对象的特性,管理数据对象的集合同样被实现成为对象,而存储在集合中的数据对象则被称为集合元素.

Java静态与动态数组特点分析

平常我们接触到的大多都是静态数组,其实在很多的时候,静态数组根本不能满足我们编程的实际需要,比方说我需要在程序运行过程中动态的向数组中添加数据,这时我们的静态数组大小是固定的,显然就不能添加数据,要动态添加数据必须要用到动态数组,动态数组中的各个元素类型也是一致的,不过这种类型已经是用一个非常大的类型来揽括-Object类型.Object类是JAVA.LANG包中的顶层超类.所有的类型都可以与Object类型兼容,所以我们可以将任何Object类型添加至属于Object类型的数组中,能添加Obj

计算机科学-第8周 字符串和动态数组 题目及参考解答

<计算机科学>课程主页在:http://blog.csdn.net/sxhelijian/article/details/13705597 1.阅读程序 阅读下面的程序,写出运行结果,上机时运行程序,记录结果,从而能够理解指针的用法(1) #include<stdio.h> int main() { int i; for(i='A'; i<'I'; i++,i++) printf("%c",i+32); printf("\n"); re

C++中关于[]静态数组和new分配的动态数组的区别分析_C 语言

本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加深对C++语言数组的理解.具体区别如下: 一.对静态数组名进行sizeof运算时,结果是整个数组占用空间的大小: 因此可以用sizeof(数组名)/sizeof(*数组名)来获取数组的长度. int a[5]; 则sizeof(a)=20,sizeof(*a)=4.因为整个数组共占20字节,首个元素(int型)占4字节. int *a=new int[4];则sizeof(a)=sizeof(*a)=4,因为

2014秋C++第16周 项目4参考 为动态数组扩容

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目4-为动态数组扩容] 下面的程序,利用动态数组保存学生的成绩.当再有一批学生成绩需要保存时,要为之扩容(和吃自助一样,用多少,取多少,这好),请补充完整下面的程序,实现如图所示的功能. int main( ) { int num,i,addNum; //num是小组人数 cout<

《C语言及程序设计》实践参考——为动态数组扩容

返回:贺老师课程教学链接 [项目3-为动态数组扩容]下面的程序,利用动态数组保存学生的成绩.当再有一批学生成绩需要保存时,要为之扩容(和吃自助一样,用多少,取多少,这好),请补充完整下面的程序,实现如图所示的功能. #include <stdio.h> #include <malloc.h> int main( ) { int num,i,addNum; //num是小组人数 printf("输入学生人数: "); scanf("%d", &