ngx_array_t是乙個順序容器,類似於stl中的vector
可以動態擴容。
原始碼位置:
nginx/src/core/ngx_array.h
nginx/src/core/ngx_array.c
typedef
struct ngx_array_s ngx_array_t;
struct ngx_array_s ;
乙個直觀的圖來看//建立動態陣列,分配n個大小為size的空間
ngx_array_t *
ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size)
a->elts = ngx_palloc(p, n * size);
if (a->elts == null)
a->nelts = 0;
a->size = size;
a->nalloc = n;
a->pool = p;
return a;
}//銷毀已經分配的陣列元素空間和動態陣列物件
void
ngx_array_destroy(ngx_array_t *a)
if ((u_char *) a + sizeof(ngx_array_t) == p->d.last)
}//向當前動態陣列a中新增乙個元素,返回新新增元素的位址
void *
ngx_array_push(ngx_array_t *a)
else
ngx_memcpy(new, a->elts, size);
a->elts = new;
a->nalloc *= 2;}}
elt = (u_char *) a->elts + a->size * a->nelts;
a->nelts++;
return elt;
}//要新增n個元素,返回新新增這一批元素的首位址
void *
ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
else
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;
return elt;
}
ngx_array_t
資料結構記憶體分布。
根據圖中所示ngx_array_create
返回的位址跟elts
的位址還有乙個array頭的差距,一會測試**可以測試驗證。
列印結果如下:#include
#include
#include "ngx_config.h"
#include "nginx.h"
#include "ngx_conf_file.h"
#include "ngx_core.h"
#include "ngx_string.h"
#include "ngx_palloc.h"
#include "ngx_list.h"
#include "ngx_queue.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, ...)
typedef
structstuinfo;
void printarray(ngx_array_t *);
void dumparrayinfo(ngx_array_t *);
int main(int argc,char**argv)
void dumparrayinfo(ngx_array_t *a)
void printarray(ngx_array_t *a)
while(seqnelts);
#endif
do while(seqnelts);
}
根據結果,可以知道:
1.驗證了(三)中ngx_array_create
返回的位址跟elts
的位址還有乙個array頭的差距
2.當pool不重新分配的時候,nelts跟nalloc共同增長,這一點跟vector有一點區別,如果把nelts元素個數比作vector中的size,把nalloc比作capability,那麼在vector中,一旦size>capability就會擴容。這一點從原始碼中很容易驗證。
nginx原始碼分析之ngx list
ngx list t是nginx封裝鍊錶的容器,其原始碼位於 宣告 nginx src core ngx list.h 定義 nginx src core ngx list.c 在nginx中使用頻繁,例如http頭部就是用ngx list t儲存的。nginx的鍊錶 頭 結構為ngx list t...
nginx 原始碼分析
近期準備研究一下nginx原始碼,此處記錄一下。計畫 1 了解evan miller 的文章 2 了解nginx的組織架構 3 了解nginx的基本資料結構 4 熟悉nginx的主要module及執行機制,主要是core http event os 5 簡單的module開發及測試 一 準備 為了方...
nginx原始碼分析 從原始碼看nginx框架總結
nginx原始碼總結 1 中沒有特別繞特別彆扭的編碼實現,從變數的定義呼叫函式的實現封裝,都非常恰當,比如從函式命名或者變數命名就可以看出來定義的大體意義,函式的基本功能,再好的架構實現在編碼習慣差的人實現也會黯然失色,如果透徹理解 的實現,領悟架構的設計初衷,覺得每塊 就想經過耐心雕琢一樣,不僅僅...