String Chunks

String Chunks — Эффективное хранение групп строк.

Краткое описание

#include <glib.h> GStringChunk; GStringChunk* g_string_chunk_new (gsize size); gchar* g_string_chunk_insert (GStringChunk *chunk, const gchar *string); gchar* g_string_chunk_insert_const (GStringChunk *chunk, const gchar *string); gchar* g_string_chunk_insert_len (GStringChunk *chunk, const gchar *string, gssize len); void g_string_chunk_free (GStringChunk *chunk);

Описание

Строковый блок используется для хранения групп строк. Память распределяется блоками и когда строки добавляются в GStringChunk они копируются в следующую свободную позицию в блоке. Когда блок заполняется распределяется следующий блок.

Когда сохраняется большое количество строк, строковые блоки более эффективны чем использование g_strdup(), так как необходимо меньше вызовов malloc(), и при распределении тратится меньше памяти на накладные расходы.

Добавление строк с помощью g_string_chunk_insert_const(), также позволяет удалять дубликаты.

Для создания новой GStringChunk используется g_string_chunk_new().

Для добавления строк в GStringChunk используется g_string_chunk_insert().

Для добавления строк в GStringChunk, но без дубликатов уже существующих строк в GStringChunk, используется g_string_chunk_insert_const().

Для освобождения элементов GStringChunk используется g_string_chunk_free(). Она не позволяет освобождать отдельные строки.

Детали

GStringChunk

typedef struct _GStringChunk GStringChunk;

Непрозрачная структура данных представляющая строковый блок (String Chunks). Она должна использоваться только при помощи следующих функций.


g_string_chunk_new ()

GStringChunk* g_string_chunk_new (gsize size);

Создаёт новый GStringChunk.

size : размер по умолчанию блока памяти который распределён для хранения строк. Если определённая строка больше чем этот размер по умолчанию, то для неё будет распределён блок большего размера.
Возвращает : новый GStringChunk.

g_string_chunk_insert ()

gchar* g_string_chunk_insert (GStringChunk *chunk, const gchar *string);

Добавляет копию string в GStringChunk. Возвращает указатель на новую копию строки в GStringChunk. Символы в строке могут быть изменены, если необходимо, однако вы не должны изменять ничего после завершения строки.

В отличие g_string_chunk_insert_const(), эта функция не контролирует дубликаты. А также строки добавленные с помощью g_string_chunk_insert() не будут найдены с помощью g_string_chunk_insert_const() при поиске дубликатов.

chunk : GStringChunk.
string : строка для добавления.
Возвращает : указатель на копию string внутри GStringChunk.

g_string_chunk_insert_const ()

gchar* g_string_chunk_insert_const (GStringChunk *chunk, const gchar *string);

Добавляет копию string в GStringChunk, если такая же строка уже не добавлена в GStringChunk с помощью g_string_chunk_insert_const().

Эта функция полезна если вам нужно копировать большое количество строк но не нужно тратить пространство хранилища под дубликаты. Но вы должны помнить что здесь могут быть указатели на туже строку и поэтому любые изменения в строках должны выполняться очень осторожно.

Помните что g_string_chunk_insert_const() не будет возвращать указатель на строку добавленную с помощью g_string_chunk_insert(), даже если они соответствуют.

chunk : GStringChunk.
string : строка для добавления.
Возвращает : указатель на новую или существующую копию string внутри GStringChunk.

g_string_chunk_insert_len ()

gchar* g_string_chunk_insert_len (GStringChunk *chunk, const gchar *string, gssize len);

Добавляет копию первых len байт string в GStringChunk. Копия nul-завершённая.

Символы в строке могут изменяться, если необходимо, однако вы не должны делать никаких изменений после завершения строки.

chunk : GStringChunk
string : байты для вставки
len : количество байт string для вставки, или -1 для вставки nul-завершённой строки.
Возвращает : указатель на копию string внутри GStringChunk

Начиная с версии 2.4


g_string_chunk_free ()

void g_string_chunk_free (GStringChunk *chunk);

Освобождает всю память распределённую GStringChunk. После вызова g_string_chunk_free() запрещается доступ к любым строкам которые содержались внутри.

chunk : GStringChunk.