Четверг, 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] */
}
Комментарии
о сколько я ошибок чудных
набил в одно мгновенье вдруг…
не прочитав статьи той мудрой
жаль мы не встречались раньше - друг…
очень жаль что прочитал столь поздно имею опыт своих ошибок… если интересно вот наработки http://labyrinter.ru/clicker/ работает однако… хотя и переделывается
еще пишу один модуль — нужен совет
Форма комментирования для «nginx programming guide: array»
Все способы связи со мной есть тут: http://catap.ru/resources/