ngx_array_init
定義在?src/core/ngx_array.h
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->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; }
ngx_array_init
函數的作用
ngx_array_init
是一個靜態內聯函數,用于初始化一個ngx_array_t
對象。它的主要任務是:
- 設置數組的基本屬性(如元素大小、預分配數量等)。
- 分配內存以存儲數組元素。
- 返回初始化是否成功的狀態。
函數簽名
static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)
參數解析
ngx_array_t *array
作用 :指向需要初始化的動態數組對象。
調用者需要提供一個已經分配好的
ngx_array_t
對象函數會填充該對象的各個字段,完成初始化
ngx_pool_t *pool
作用 :指定用于分配內存的 Nginx 內存池。
Nginx 使用內存池機制來管理內存,
pool
是內存池的核心對象。數組元素的存儲空間將從這個內存池中分配。
ngx_uint_t n
作用 :指定數組的初始容量,即預分配的元素數量。
n
表示數組最多可以存儲多少個元素。如果實際存儲的元素數量超過
n
,則需要擴容
size_t size
作用 :指定數組中每個元素的大小(單位為字節)。
size
通常是通過sizeof
計算得出的類型大小。函數會根據
size
和n
計算出需要分配的總內存大小(n * size
)。返回值類型 :
ngx_int_t
NGX_OK
:表示初始化成功。
NGX_ERROR
:表示初始化失敗。如果內存分配成功且所有字段都正確初始化,則返回
NGX_OK
。如果內存分配失敗(
ngx_palloc
返回NULL
),則返回NGX_ERROR
。?
array->nelts = 0;
?將
nelts
設置為 0,表示當前數組中還沒有存儲任何元素
ngx_array_t
typedef struct {void *elts; // 指向數組元素的內存塊ngx_uint_t nelts; // 當前數組中已存儲的元素數量size_t size; // 每個元素的大小(單位為字節)ngx_uint_t nalloc; // 數組預分配的元素數量ngx_pool_t *pool; // 內存池指針,用于分配內存 } ngx_array_t;
elts
:指向實際存儲數組元素的內存區域。nelts
:記錄當前數組中已經存儲的元素數量。size
:每個元素的大小,通常通過sizeof
計算得出。nalloc
:數組預分配的空間大小,表示最多可以存儲多少個元素。pool
:Nginx 的內存池對象,用于管理內存分配和釋放。
ngx_array_t
的設計充分利用了 Nginx 的內存池機制,避免了頻繁的內存分配和釋放操作,從而提高了性能。
?
array->size = size;
將
size
參數賦值給array->size
,表示數組中每個元素的大小
array->nalloc = n;
?將
n
參數賦值給array->nalloc
,表示數組預分配的元素數量
array->pool = pool;
?將
pool
參數賦值給array->pool
,表示數組使用的內存池
array->elts = ngx_palloc(pool, n * size);
?作用 :調用
ngx_palloc
函數,從內存池中分配一塊大小為n * size
的連續內存,并將其地址賦值給array->elts
。
n * size
表示需要分配的總內存大小。
ngx_palloc
是 Nginx 內存池的核心函數,用于從內存池中分配內存。
if (array->elts == NULL) {return NGX_ERROR;}
?作用 :檢查
array->elts
是否為NULL
,如果是,則返回NGX_ERROR
表示初始化失敗。如果內存分配失敗,數組無法正常工作,因此需要立即終止初始化過程。
返回
NGX_ERROR
可以讓調用者知道初始化失敗的原因。
return NGX_OK; }
作用 :如果所有步驟都成功執行,則返回
NGX_OK
表示初始化完成。