Книга: Linux программирование в примерах
3.2.1.7. Использование персональных программ распределения
3.2.1.7. Использование персональных программ распределения
Набор функций с malloc()
является набором общего назначения по выделению памяти. Он должен быть способен обработать запросы на произвольно большие или маленькие размеры памяти и осуществлять все необходимые учетные действия при освобождении различных участков выделенной памяти. Если ваша программа выделяет значительную динамическую память, вы можете обнаружить, что она тратит большую часть своего времени в функциях malloc()
.
Вы можете написать персональную программу распределения — набор функций или макросов, которые выделяют большие участки памяти с помощью malloc()
, а затем дробят их на маленькие кусочки по одному за раз. Эта методика особенно полезна, если вы выделяете множество отдельных экземпляров одной и той же сравнительно небольшой структуры.
Например, GNU awk (gawk) использует эту методику. Выдержка из файла awk.h
в дистрибутиве gawk
(слегка отредактировано, чтобы уместилось на странице):
#define getnode(n) if (nextfree) n = nextfree,
nextfree = nextfree->nextp; else n = more_nodes()
#define freenode(n) ((n)->flags = 0, (n)->exec_count = 0,
(n)->nextp = nextfree, nextfree = (n))
Переменная nextfree
указывает на связанный список структур NODE. Макрос getnode()
убирает из списка первую структуру, если она там есть. В противном случае она вызывает more_nodes()
, чтобы выделить новый список свободных структур NODE
. Макрос freenode()
освобождает структуру NODE
, помещая его в начало списка.
ЗАМЕЧАНИЕ. Первоначально при написании своего приложения делайте это простым способом: непосредственно используйте malloc()
и free()
. Написание собственного распределителя вы должны рассмотреть лишь в том и только в том случае, если профилирование вашей программы покажет, что она значительную часть времени проводит в функциях выделения памяти.
- 3.2.1.1. Исследование подробностей на языке С
- 3.2.1.2. Начальное выделение памяти: malloc()
- 3.2.1.3. Освобождение памяти: free()
- 3.2.1.4. Изменение размера: realloc()
- 3.2.1.5. Выделение с инициализацией нулями: calloc()
- 3.2.1.6. Подведение итогов из GNU Coding Standards
- 3.2.1.7. Использование персональных программ распределения
- 3.2.1.8. Пример: чтение строк произвольной длины
- 3.2.1.9. Только GLIBC: чтение целых строк: getline() и getdelim()
- Глава 12. Методы распространения товаров: каналы распределения и товародвижение
- 8.2. Языки программирования Виды программирований
- 1.1. Введение в объектно-ориентированное программирование
- Восстановление с использованием инструмента gbak
- 11.2. СВОЙСТВА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
- СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
- Типы страниц и их использование
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- Использование констант
- 6.2. Типичные ошибки при проведении программ продвижения и варианты их устранения
- Использование переменной окружения ISC_PATH
- Использование сервера Yaffil внутри процесса