Recycle Freed Предметы - PullRequest
       20

Recycle Freed Предметы

3 голосов
/ 02 июня 2010

предположим, что мне нужно часто размещать и удалять объекты в куче (произвольного размера), есть ли какое-то преимущество в производительности, если вместо удаления этих объектов я верну его обратно в некоторый "пул", чтобы использовать его позже?

даст ли это выгоду за счет уменьшения выделения / освобождения кучи? Или оно будет медленнее по сравнению с производительностью распределителя памяти, поскольку «пулу» необходимо управлять динамическим набором указателей.

мой вариант использования: предположим, что я создаю контейнер очереди на основе связанного списка, и каждый узел этого списка размещается в куче, поэтому каждый вызов push () и pop () будет выделять и освобождать этот узел:

`

template <typename T> struct QueueNode {
    QueueNode<T>* next;
    T object;
}

template <typename T> class Queue {
    void push(T object) {
        QueueNode<T>* newNode = QueueNodePool<T>::get(); //get recycled node
        if(!newNode) {
            newNode = new QueueNode<T>(object);
        }
        // push newNode routine here..
    }
    T pop() {
        //pop routine here...
        QueueNodePool<T>::store(unusedNode); //recycle node
        return unusedNode->object;
    }
}

`

Ответы [ 5 ]

4 голосов
/ 02 июня 2010

Объединение в пулы - очень распространенная техника, позволяющая избежать частых распределений и освобождений. Некоторые рассматривают это как шаблон дизайна . Обычно существуют реализации, поэтому нет смысла изобретать велосипед.

Возможно, вы захотите взглянуть на вопрос Пул объектов и динамическое распределение

1 голос
/ 02 июня 2010

Вы можете взглянуть на Увеличенный пул объектов - для идей, справки или лучше всего для использования :>

1 голос
/ 02 июня 2010

У меня были похожие проблемы, когда я задавал этот вопрос. Ответы могут быть полезными для вас, особенно те, которые касаются проблем фрагментации памяти.

0 голосов
/ 02 июня 2010

В зависимости от вашей библиотеки времени выполнения у вас может быть «достаточно хороший» распределитель для многих случаев. То есть вам следует встроить распределитель пула для вашего приложения только в том случае, если вы можете продемонстрировать, что у вас особый вариант использования или плохая реализация malloc в libc.

Поскольку большая часть работы Дуга Ли представлена ​​в библиотеке GNU, вы можете прочитать о его опыте в Распределитель памяти .

0 голосов
/ 02 июня 2010

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

...