日韩性视频-久久久蜜桃-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的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲一区二区在线电影 | 毛片在线网站 | 中日韩精品视频在线观看 | 中文字幕av免费在线观看 | 人妻人人澡人人添人人爽 | 欧美性猛交7777777 | 爱av导航 | 97操操 | 欧美色悠悠| 亚洲欲| 丰满护士巨好爽好大乳 | 亚洲天堂2013 | 99精品一区二区三区无码吞精 | 黄色免费在线播放 | 都市激情亚洲色图 | 最近中文字幕在线mv视频在线 | 影音先锋中文字幕资源 | 国产免费av观看 | 美女扒开让男人桶爽 | 亚洲综合精品国产 | 人与拘一级a毛片 | 色福利hd写真video | 日本高清二区 | 亚洲国产一区二区三区 | 国产成人久久精品77777综合 | 男女爱爱网站 | 手机在线观看日韩av | 白白色2012年最新视频 | 色牛影院 | 亚洲第一福利网站 | 嘿咻视频在线观看 | 久久精品二区 | 三级特黄视频 | 国产欧美精品区一区二区三区 | 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 自拍视频网站 | 免费99视频| 国产精品视频合集 | av色欲无码人妻中文字幕 | 亚洲a一区 | 精品裸体舞一区二区三区 | 在线观看日韩中文字幕 | 国产一区二区三区在线免费 | 18视频在线观看网站 | 15p亚洲 | 国产乱真实合集 | 亚洲无码精品国产 | 欧美一区二区三区国产 | 尤物视频在线观看国产 | 在线播放av网站 | 国产免费又爽又色又粗视频 | 91精品美女| 久久精品视频91 | 99国产精品白浆在线观看免费 | 精品国产乱码久久久久久蜜臀网站 | 日韩深夜福利 | 黄色片在线免费看 | 黄瓜污视频 | 激情久久中文字幕 | 亚洲最新av网站 | 国产成人自拍网 | 黄色三极片 | 久久午夜影院 | 欧美成人性生活视频 | 天天操天天干天天 | 欧美 日韩 国产 激情 | 国产男男gay体育生白袜 | 欧美激情一区二区三区p站 欧美mv日韩mv国产网站app | 亚洲精品xxxxx | 欧美大黄视频 | 猫咪av网| 久久偷看各类女兵18女厕嘘嘘 | 亚洲欧美影院 | 麻豆精品一区二区 | 超碰成人免费电影 | 久久天| 夜夜添无码一区二区三区 | 欧美人与动物xxx | 国产精品.www | 国产视频在线观看免费 | 色网在线免费观看 | 2014亚洲天堂 | 明星毛片 | 无码国产精品久久一区免费 | 日韩av一区二区三区四区 | 亚洲一区精品在线 | 午夜秋霞 | 成人免费a视频 | 国产伦子伦对白视频 | 人妻在卧室被老板疯狂进入 | 国产伦精品一区二区三区精品 | 国产精品乱码久久久久久久久 | 成av人片一区二区三区久久 | 欧美色久 | 奶波霸巨乳一二三区乳 | 蜜桃av噜噜一区二区三区麻豆 | 嫩草视频在线观看免费 | 做暧暧视频在线观看 | 丝袜操|