Четверг, 17 Апрель 2008

nginx programming guide: array

В продолжение рассказа о списках стоит рассказать и о массивах в nginx.

Общие сведения

Рассказывать буду только об отличиях относительно списков.

Каждый массив это структура

struct ngx_array_s {
    void        *elts;
    ngx_uint_t   nelts;
    size_t       size;
    ngx_uint_t   nalloc;
    ngx_pool_t  *pool;
};

Если посмотреть внимательно, можно понять что это похоже на список, у которого просто нет частей. На самом деле так оно и есть.

Работа с массивами

Создание

Массив, как и список, всегда можно пересоздать используя функцию:

ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);

Логика ее работы аналогична списку.

Инициализация

Так же как и список, массив может быть переинициализирован функцией:

static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)

Как и в случае списков, ее логика работы аналогична.

Добавление элемента

Элемент можно добавить один, а можно и несколько за один раз. Для добавления одного элемента надо использовать функцию:

void *ngx_array_push(ngx_array_t *a);

Для несколких:

void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n);

В качестве результата работы мы получим указатель в который можно записать значения элементов.

Если количество элементов массива (nelts) стало равным (nalloc), а мы пытаемся добавить новый элемент (или даже не один), то будет создан новый массив в который будут скопированы все данные со старого. Если это возможно то старый массив будем уничтожен до смерти pool’а к которому он привязан.

Т.е. если вы знаете что вам надо добавить 10 элементов в массив, то лучше это сделать сразу, одним вызовом ngx_array_push_n. Этим вы сэкономите на выделениях памяти (время) и саму память, если убить старый массив невозможно.

Уничтожение массива

Любой массив можно попытаться уничтожить используя функцию:

void ngx_array_destroy(ngx_array_t *a);

Если последняя выделенная память из pool’а принадлежала массиву, то ее можно просто вернуть в распоряжение алокатора. Если же нет, то массив удалить не уничтожить не удастся. Только вместе с pool’ом.

Хождение по элементам списка

Это значительно легче чем в случае списков, но надо помнить что array.elts это void* и надо приводить к чему-то получше:

ngx_str_t  *array_elts;
array_elts = array.elts;
for (i = 0; i < array.nelts; i++) {

  /* use element of array as array_elts[i] */

}

Написано в: 16:32 | 2 комментария | | теги: , , , , , | постоянная ссылка |
Добавить пост в:   Delicious Reddit Slashdot Digg Technorati Google


Последние комментарии

Комментарии

Alexandre 14.04.2009 1:31


о сколько я ошибок чудных

набил в одно мгновенье вдруг…

не прочитав статьи той мудрой

жаль мы не встречались раньше - друг…

очень жаль что прочитал столь поздно имею опыт своих ошибок… если интересно вот наработки http://labyrinter.ru/clicker/ работает однако… хотя и переделывается

еще пишу один модуль — нужен совет

ответить

Форма комментирования для «nginx programming guide: array»

Обязательное поле. Не больше 30 символов.

Обязательное поле

Kirill A. Korinskiy 14.04.2009 16:01

Все способы связи со мной есть тут: http://catap.ru/resources/

ответить