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
表示初始化完成。