ホームページ >バックエンド開発 >PHPチュートリアル >Nginxの高度なデータ構造ソースコード解析(2) ----- 動的配列

Nginxの高度なデータ構造ソースコード解析(2) ----- 動的配列

WBOY
WBOYオリジナル
2016-07-30 13:30:29930ブラウズ

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;
}
現在の動的配列に n 個の要素を追加します:

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 チュートリアルに興味のある友人の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。