Обстак
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
На языке программирования C Obstack — для управления памятью это расширение GNU стандартной библиотеки C. [ 1 ] «Стек объектов» — это «стек» « объектов » (элементов данных), которым управляют динамически. [ 2 ] Он реализует схему управления памятью на основе регионов .
Код Obstack обычно предоставляет C макросы , которые отвечают за распределение и управление памятью для пользователя. По сути, obstacks используются как форма управления памятью может быть более эффективной и менее сложной в реализации, чем malloc / free , которая в некоторых ситуациях . Например, скажем, нужно настроить стек для обработки элементов данных, число которых некоторое время растет, а затем достигает окончательной формы; такой стек можно определить в obstack.h .
Освобождение выделенных объектов
[ редактировать ]Как только объекту выделяется новый фрагмент памяти в obstack, он должен быть освобожден после использования.
Функции и макросы
[ редактировать ]Интерфейсы для использования obstacks могут быть определены либо как функции , либо как макросы , в зависимости от компилятора . Средство obstack работает со всеми компиляторами C. [ сомнительно – обсудить ]
В старомодном компиляторе C, отличном от ISO, все функции obstack фактически определяются только как макросы. Вы можете вызывать эти макросы как функции, но не можете использовать их каким-либо другим способом. Например, вы не можете взять их адрес.
Вызов макросов требует особой предосторожности: а именно, первый операнд (указатель obstack) не должен содержать никаких побочных эффектов, поскольку он может быть вычислен более одного раза.
В ISO C каждая функция obstack имеет как определение макроса, так и определение функции. Определение функции используется, если макроподстановка не удалась. При обычном вызове по умолчанию используется определение макроса, но вместо этого вы можете запросить определение функции, написав имя функции в круглых скобках, как показано здесь:
char *x;
void *(*funcp)();
x = obstack_alloc(obptr, size); /* Use the macro. */
x = (obstack_alloc) (obptr, size); /* Call the function. */
funcp = obstack_alloc; /* Take the address of the function. */
Это та же самая ситуация, которая существует в ISO C для функций стандартной библиотеки .
Выращивание объектов
[ редактировать ]Поскольку фрагменты памяти в obstack используются последовательно, можно создать объект, добавив в его конец данные размером «байт». Этот метод пошагового создания объекта называется «выращиванием объекта».