ngx_array_t は、Nginx で広く使用されているシーケンシャル コンテナです。要素を配列の形式で保存し、配列容量の上限に達した場合の配列のサイズの動的変更をサポートします。 C++ のベクター コンテナーに似ており、Nginx によってカプセル化されたメモリ プールが組み込まれているため、割り当てられたメモリもメモリ プールに適用されます。
ngx_array_t には次の 3 つの利点があります。
(1) 高速アクセス。
(3)責任者の割り当て要素が占有するメモリはメモリ プールによって均一に管理されます。
動的配列の容量を拡張するには 2 つの方法があります:
(1) 現在のメモリ プールの残りの領域が今回追加する必要がある領域以上の場合、この拡張は新しいスペースを拡張するだけです。
(2) 現在のメモリプールの残りの領域が今回追加する必要がある領域よりも少ない場合、ngx_array_push メソッドの場合は元の動的配列の容量が 2 倍になり、 ngx_array_push_n、拡張量はパラメータと元の動的配列の容量に基づいて決定されます。
out out out of 動的配列を破棄します:
typedef struct { void *elts;//首地址 ngx_uint_t nelts;//已使用的元素个数 size_t size;//每个数组元素占用的内存大小 ngx_uint_t nalloc;//可以容纳元素的个数的总大小 ngx_pool_t *pool;//内存池对象 } 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)//初始化数组 { /* * set "array->nelts" before "array->elts", otherwise MSVC thinks * that "array->nelts" may be used without having been initialized */ array->nelts = 0; //首地址为0 array->size = size; //每个元素所占内存大小 array->nalloc = n; //分配的元素个数 array->pool = pool; //内存池对象 //申请n*size这么大的内存空间 array->elts = ngx_palloc(pool, n * size); if (array->elts == NULL) { return NGX_ERROR; } return NGX_OK; }
ngx_array_t * ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size)//创建数组 { ngx_array_t *a; a = ngx_palloc(p, sizeof(ngx_array_t));//申请数组本身的内存 if (a == NULL) { return NULL; } if (ngx_array_init(a, p, n, size) != NGX_OK) {//初始化,即申请可以存储元素的内存 return NULL; } return a; }
著作権表示: この記事はブロガーによるオリジナル記事であり、ブロガーの許可なく複製することはできません。
以上、Nginx の高度なデータ構造ソースコード解析 (2) ----- 動的配列の内容を紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。