memory pool
не используя malloc() и free() (т.е не используя динамическую память)
Подскажите, пожалуйста, где можно это найти. Заранее огромное спасибо.
в гугле найти можно.... лень и нежелание не повод для того, чтобы идти на форум!!!
Спасибо большое за твой ответ и твою ссылку.
Но мне это не подходит. Т.к код соответствующий этой ссылке обращается с операционной системе, для получения памяти. А мне это не подходит.
Я очень много искала в гугле прежде, чем обратилась не форум.
Но то что мне надо так и не нашла.
Всё что я находила обязательно обращается к функциям malloc() и free(), а для моего кода их нельзя использовать.
Почему нельзя использрвать? Что можно использовать?
ок, а new и delete можно? :)
Цитата: jkmuf
Тень Пса!
Всё что я находила обязательно обращается к функциям malloc() и free(), а для моего кода их нельзя использовать.
Всё что я находила обязательно обращается к функциям malloc() и free(), а для моего кода их нельзя использовать.
:eek: как можно написать memory pool без malloc и free?
обращаться к нему.
Я нашла подобный пример в книге по С Кегнигана и Ричи глава 8 (+глава 5).
Можно использовать new и delete, но чтобы внутри себя они не обращались с вышесказанным функциям.
Цитата: jkmuf
Можно выделить массив большого размера, а потом вместо malloc и free
обращаться к нему.
Я нашла подобный пример в книге по С Кегнигана и Ричи глава 8 (+глава 5).
обращаться к нему.
Я нашла подобный пример в книге по С Кегнигана и Ричи глава 8 (+глава 5).
Создание большого массива на стеке приведет к значительносму снижению быстродействия программы, а в некоторых случиях и к её неработоспособности.
Цитата: jkmuf
Можно использовать new и delete, но чтобы внутри себя они не обращались с вышесказанным функциям.
В конечном счете все эти операторы и функции приводят к вызову API VirtualAlloc и т.п., без чего не обойтись.
VirtualAlloc ничего общего с кучей (а под динамической памятью, я так думаю, надо понимать кучу) не имеет.
По поводу данной конкретной темы скажу: можно управлять пулом памяти (по сути, своей собственной кучей) с помощью VirtualAlloc, а внутри этой кучи распределение/освобождение реализовать придется руками.
Общий алгоритм предлагаю такой.
1. Работа с пулом (кучей).
Здесь есть два варианта: зарезервировать (не выделить!) сразу большое пространство, либо выделять понемногу (тогда пул может оказаться разбросанным по адресному пространству).
Первый вариант. Резервируем очень большую память (скажем, 1-2 Гб). При этом реального выделения памяти не происходит, но происходит резервирование адресов в адресном пространстве, в результате никто эти зарезервированные адреса ни выделить, ни зарезервировать не сможет. А реально выделять будем только по необходимости. Подробности см. VirtualAlloc.
Второй вариант. Выделяем некоторый кусок памяти, размерами не большой и не маленький (скажем, 8 Мб). Он кончается - выделяем еще один, и т. д. Но получится, что куча состоит из разбросанных кусков памяти, это немного усложняет задачу.
2. Собственно выделение памяти (рукописные malloc/free/new/delete).
Здесь рекомендую алгоритмы LFH (low-fragmentation heap). Принцип таков, что вся куча бьется на под-кучу 4-байтных элементов, подкучу 8-байтных элементов, 16-байтных элементов и т. д. (скажем, до 512-байтных элементов). Каждая подкуча выделяет элемент строго фиксированного, своего размера, что облегчает ведение списка занятой/свободной памяти, а в итоге - к быстрому выделению/освобождению памяти, и к тому же фрагментация тут низка. Когда приложение требует блок памяти N-го размера, ищем ближайшую подкучу, у которой размер элемента больше или равен N (скажем, для выделения 21 байт используем кучу 32-байтных элементов).
Остается решить задачу синхронизации, если разрабатываемое приложение многопотоковое, или для каждого потока реализовать свою кучу.
P. S. Полезно будет почитать про boost:: pool. Об этом надо искать где-то на http://www.boost.org. Можно также почитать MSDN по функциям, связанным с кучей (HeapAlloc, HeapCreate и т. д.)
Цитата: cheburator
Green,
VirtualAlloc ничего общего с кучей (а под динамической памятью, я так думаю, надо понимать кучу) не имеет.
VirtualAlloc ничего общего с кучей (а под динамической памятью, я так думаю, надо понимать кучу) не имеет.
Я сказал "и т.п.", подразумевая и вызов HeapAlloc.
Cheburator! Видел ли ты где нибуть программу на С рефлизующую второй алгоритм! Заранее благодарна!
Нет, не видел (если ты про LFH). Просто идея очень проста, я думаю, реализовать не так уж трудно.