日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx学习七 高级数据结构之动态数组ngx_array_t

發布時間:2025/6/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nginx学习七 高级数据结构之动态数组ngx_array_t 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 ngx_array_t結構

ngx_array_t是nginx內部使用的數組結構。nginx的數組結構在存儲上與大家認知的C語言內置的數組有相似性。比方實際上存儲數據的區域也是一大塊連續的內存。

可是數組除了存儲數據的內存以外還包括一些元信息來描寫敘述相關的一些信息,而且能夠動態增長。以下

我們從數組的定義上來具體的了解一下。

ngx_array_t的定義位于src/core/ngx_array.c|h里面。

struct ngx_array_s {void *elts;//數組的首地址ngx_uint_t nelts;//數組中已經使用的元素個數size_t size; //每一個元素占用的內存大小ngx_uint_t nalloc;//當前數組中可以容納元素的個數ngx_pool_t *pool; //內存池對象 }; elts指向存儲數據內存的起始地址。

nelts是數組中實際已經存儲的元素個數

size是每一個數組元素占用內存的大小。比方int占用4個字節的大小,size=4。

nalloc是數組空間大小。

pool成員函數負責管理數組使用的內存。


2函數操作

nginx為數組提供了五個操作函數例如以下:

//創建一個動態數組。數組的大小為n,每一個元素的大小為size
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);

//向數組中加入n個元素,返回這n個元素中第一個元素的地址
void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n);

//和create函數的功能差點兒相同,僅僅只是這個array不能為空,返回值為是否初始化成功
static ngx_inline ngx_int_t
ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)

2.1ngx_array_create


ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);
創建一個數組,p是內存池對象, n為數組存儲元素的個數, size為每一個元素占用的空間大小。

來看看源碼:

ngx_array_t * ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size) {ngx_array_t *a;//1:創建ngx_array_t指針。這個array的內存也是在p上申請的a = ngx_palloc(p, sizeof(ngx_array_t));if (a == NULL) {return NULL;}//2:申請數組存儲元素的內存a->elts = ngx_palloc(p, n * size);if (a->elts == NULL) {return NULL;}//初始化成員a->nelts = 0;a->size = size;a->nalloc = n;a->pool = p;return a;//返回數組指針 }

2.2 ngx_array_destroy

void ngx_array_destroy(ngx_array_t *a);

回收已分配給數組的內存,包含數組本身??丛创a:

void ngx_array_destroy(ngx_array_t *a) {ngx_pool_t *p;p = a->pool;//1:銷毀數組存儲元素的內存,即數據區的內存if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {p->d.last -= a->size * a->nalloc;}//2:銷毀數組本身的內存,即結構體array本身的內存//a = ngx_palloc(p, sizeof(ngx_array_t));這句代碼申請的內存if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {p->d.last = (u_char *) a;} }2.3 ngx_array_push

void *ngx_array_push(ngx_array_t *a);

向數組中加入元素。而且返回新添加元素的地址??丛创a:

void * ngx_array_push(ngx_array_t *a) {void *elt, *new;size_t size;ngx_pool_t *p;if (a->nelts == a->nalloc) {//數組已滿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)//假設p的剩余空間>=一個數組元素的空間。就分配一個空間給數組{p->d.last += a->size;//調整pool的last。即改動下一次可分配空間的事實上地址a->nalloc++;} else {new = ngx_palloc(p, 2 * size);//申請新的空間,大小是原來的2倍,假如pool的內存不足夠分配一個新的數組元素if (new == NULL) {return NULL;}ngx_memcpy(new, a->elts, size);//把原有的元素復制到新分配的內存區a->elts = new;//改動數組數據區的地址,使其指向新分配的內存區a->nalloc *= 2;//改動數組可容納的元素個數,是原來容納元素的2倍}}elt = (u_char *) a->elts + a->size * a->nelts;//新添加元素的地址a->nelts++;//數組中元素的個數加1return elt;//返回新添加元素的地址 }
調用這個函數并沒用真的加入進元素,它僅僅是返回新加元素將要被放入數組的地址,我們必須按例如以下操作才干真正的加入如元素:

//加入一個int元素 ngx_int_t* elem; elem = ngx_array_push(array);//得到新增元素地址 *elem = 10;
2.4ngx_array_push_n

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

向數組中加入n個元素。返回這n個元素中第一個元素的地址。


void * ngx_array_push_n(ngx_array_t *a, ngx_uint_t n) {void *elt, *new;size_t size;ngx_uint_t nalloc;ngx_pool_t *p;size = n * a->size;if (a->nelts + n > a->nalloc) {//數組已滿p = a->pool;if ((u_char *) a->elts + a->size * a->nalloc == p->d.last&& p->d.last + size <= p->d.end)//假設pool剩余的內存可以容納這n個元素,就不用又一次分配內存{p->d.last += size;//改動last使其指向可分配內存的起始地址a->nalloc += n;//數組容納元素個數+n} else {//假設pool剩余的內存不可以容納這n個元素。就又一次分配內存nalloc = 2 * ((n >= a->nalloc) ?

n : a->nalloc);//申請2倍的內存 new = ngx_palloc(p, nalloc * a->size); if (new == NULL) { return NULL; } ngx_memcpy(new, a->elts, a->nelts * a->size);//把原有的元素復制到新申請的內存中 a->elts = new;//改動數組元素區的地址 a->nalloc = nalloc;//改動數組可以容納的元素個數 } } elt = (u_char *) a->elts + a->size * a->nelts;//新增元素的首地址 a->nelts += n;//已存儲元素個數+n return elt; }


2.5 ngx_array_init

ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size);

和create函數的功能差點兒相同,僅僅只是這個array不能為空,返回值為是否初始化成功

static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size) {/** set "array->nelts" before "array->elts", otherwise MSVC thinks* that "array->nelts" may be used without having been initialized*///初始化array,array不能為空array->nelts = 0;array->size = size;array->nalloc = n;array->pool = pool;array->elts = ngx_palloc(pool, n * size);//申請內存空間if (array->elts == NULL) {return NGX_ERROR;}return NGX_OK; }
3 ngx_array_t的一個使用

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

/* author: smtl date: 2014-09-28 */#include <stdio.h> #include <stdlib.h> #include <ngx_core.h> #include <ngx_config.h> #include <ngx_conf_file.h> #include <nginx.h> #include <ngx_string.h> #include <ngx_palloc.h> #include <ngx_array.h>//不加以下這兩個定義編譯會出錯 volatile ngx_cycle_t *ngx_cycle;void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,const char *fmt, ...) { }int main()//too many migical number {ngx_pool_t* pool = ngx_create_pool(2048, NULL);if (pool == NULL){printf("create pool failed\n");exit(1);}ngx_array_t* array = ngx_array_create(pool, 20, sizeof(ngx_int_t));if (array == NULL){printf("array alloc failed\n");exit(1);}ngx_int_t i;ngx_int_t* elem;for (i=0; i<20; ++i){elem = ngx_array_push(array);//加入元素*elem = i;}elem = (int*)array->elts;for (i=0; i<20; ++i){printf("array[%d] = %d \n", i, elem[i]);}printf("加入10個元素:\n");ngx_int_t n = 10;elem = ngx_array_push_n(array, n);for (i=0; i<n; ++i){elem[i] = 20 + i;}elem = (int*)array->elts;for (i=20; i<20+n; ++i){printf("array[%d] = %d \n", i, elem[i]);}ngx_array_destroy(array);printf("ngx_array_int:\n");array = ngx_pcalloc(pool, sizeof(ngx_array_t));//注意這個函數和ngx_array_create的差別。array不能為空ngx_array_init(array, pool, 20, sizeof(ngx_int_t));for (i=0; i<20; ++i){elem = ngx_array_push(array);//加入元素*elem = rand()%1000;}elem = array->elts;for (i=0; i<20; ++i){printf("array[%d] = %d \n", i, elem[i]);}ngx_destroy_pool(pool);return 0; }

http://blog.csdn.net/xiaoliangsky/article/details/39647771

總結

以上是生活随笔為你收集整理的nginx学习七 高级数据结构之动态数组ngx_array_t的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩夜夜操| 日本a级片在线播放 | 黄色三级三级三级三级 | 女性裸体瑜伽无遮挡 | 一区二区三区国产在线 | 亚洲精品一区二区三区四区五区 | 1024手机在线看片 | 蜜臀av夜夜澡人人爽人人 | 香蕉精品视频在线观看 | 日韩a级一片 | 精品视频 | 在线性视频| 国产麻豆精品在线观看 | 中文字幕人妻一区二 | 在线观看国产一区二区三区 | 婷婷色中文 | 日本中文字幕在线观看 | 99riav3国产精品视频 | 亚洲精品免费电影 | 无码人妻av免费一区二区三区 | 日本色一区 | 国产黄色免费视频 | 久久成人国产精品入口 | h在线免费 | 成人狠狠干 | 亚洲av无码一区二区二三区软件 | 亚洲人成高清 | www.欧美精品 | 91福利免费 | 国产在线不卡 | 日韩成人精品 | 91精品国产综合久久久久 | 免费观看久久久 | 手机在线中文字幕 | 黄色片在哪里看 | 夜色综合 | 99re8在线精品视频免费播放 | 欧美色综合天天久久综合精品 | 久综合网| 男女av网站 | 韩国三级与黑人 | 国产91精品久久久 | 在线观看免费看片 | 全国男人天堂网 | 欧美日韩国产免费观看 | 久久国产毛片 | 日本高清中文字幕 | 亚洲欧美精品在线 | 色倩网站 | 色呦呦免费视频 | 国模精品一区二区三区 | 欧美激情动态图 | 午夜色片| 中文字幕精品视频 | 蜜臀视频一区二区 | 国产人成在线 | 精品国产丝袜一区二区三区乱码 | 欧美网| 亚洲免费观看高清 | 齐天大性床战铁扇公主 | 人超碰| 永久免费观看av | 91丝袜一区二区三区 | 加勒比毛片 | 欧美日韩精品综合 | 性史性农村dvd毛片 日韩精品在线视频观看 | 翔田千里一区二区三区av | 性生交生活片1 | 成人久久久久久久 | 新91av| 91啪国产 | 探花国产精品一区二区 | 人妻互换免费中文字幕 | 日本丰满少妇一区二区三区 | 亚洲成人中文字幕 | a级片日本| 人人爽人人爽人人片av | 在线观看中文字幕2021 | 72种无遮挡啪啪的姿势 | 91成人免费在线观看 | 91香蕉一区二区三区在线观看 | 好看的毛片 | 成人黄色在线看 | 午夜视频在线观看一区二区 | 午夜免费网站 | 主人性调教le百合sm | 在线观看欧美一区 | 未满十八18禁止免费无码网站 | 国产日韩精品一区二区三区 | 国产精品乱子伦 | 韩日视频 | a级片在线免费看 | 在线观看av中文字幕 | 波多野结衣绝顶大高潮 | 熟女精品一区二区三区 | 国产极品一区 | 欧美鲁鲁 | 色婷婷aⅴ一区二区三区 | avtt2015|