Функции копирования
Last updated
Was this helpful?
Last updated
Was this helpful?
Основным обобщением между всеми glib типами (базовыми и небазовыми, классофицированными и неклассофицированными, instantiable и non-instantiable) является то, что ими можно манипулировать через единственный API для копирования и создания типов.
Структура используется как абстрактный контейнер для всех этих типов. Её упрощенный API (определён в gobject/gvalue.h
) может использоваться для вызова value_table функций в течение регистрации типа: например для копирования содержимого в другой . Это подобно назначению в C++, когда вызывается оператор копирования C++, чтобы по умолчанию побитно модифицировать копию семантики C++/C структур/классов.
Следующий код демонстрирует как можно копировать 64 битное целочисленное, так же как экземпляр указателя (код этого примера находится в исходном пакете этой документации в sample/gtype/test.c
):
Важно в выше представленном коде то, что точная семантика вызова копирования не определена так как зависит от реализации функции копирования. Определённые функции копирования могут решить распределить новый участок памяти и зтем скопировать данные из источника в адресат. Другие могут просто увеличить количество ссылок на экземпляр и скопировать ссылку в новый GValue.
value_table определённый в gtype.h
используется для определения этих функций и полностью описан в документации API поставляемой с GObject (for once ;-) это объясняет почему мы не будем детализировать точную семантику.
Маловероятно что вы будете когда либо определять value_table в процессе регистрации типа потому что value_tables наследуется из родительского типа для небазовых типов, это значит что если вы хотите создать базовый тип (не очень хорошая идея!), вам не потребуется обеспечить новый value_table так как вы унаследуете структуру value_table из родителя вашего типа.
[] Пожалуйста помните что есть другие функции регистрации: . Мы не будем обсуждать эту функцию здесь, так как её использование очень похоже на версию _static
.