C ++: Распределители памяти - PullRequest
15 голосов
/ 10 января 2011

Я слышал о людях, использующих пользовательские распределители памяти для своего проекта, в частности, в C ++.

  • Что такое пользовательский распределитель памяти по сравнению с malloc?

  • Разве malloc не самый низкий уровень, который вы уже можете пройти?

Ответы [ 5 ]

19 голосов
/ 10 января 2011

Распределитель памяти не нижний уровень , чем malloc.(Распределитель по умолчанию обычно вызывает malloc прямо или косвенно)

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

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

Что касается вашего второго вопроса, malloc - это самый низкий показатель, который вы можете выполнить, не потеряв мобильности.malloc обычно реализуется с использованием некоторой специфичной для ОС функции выделения памяти, так что это будет еще более низкий уровень.Но это не имеет отношения к вашему основному вопросу, поскольку распределители C ++ - это абстракция более высокого уровня.

17 голосов
/ 10 января 2011

Подробное описание пользовательских распределителей вместе с их эмпирической оценкой приведено в следующей статье (которую я написал в соавторстве).Прежде чем вы решите использовать пользовательские распределители в вашем C ++ проекте, вы должны прочитать эту статью.Общий обзор: хороший распределитель общего назначения лучше (быстрее и экономичнее), чем все стили пользовательских распределителей, кроме регионов, но у них есть серьезные проблемы .

Пересмотр пользовательского распределения памяти ( ACM-ссылка , прямая PDF-ссылка , Powerpoint talk-слайды ), OOPSLA 2002.

Программисты, надеющиеся добиться улучшения производительности, часто используют собственные распределители памяти.В этом углубленном исследовании рассматриваются восемь приложений, использующих пользовательские распределители.Удивительно, что для шести из этих приложений современный распределитель общего назначения (распределитель Lea) работает так же хорошо или лучше, чем пользовательские распределители.В двух исключениях используются регионы, которые обеспечивают более высокую производительность (улучшение до 44%).Регионы также уменьшают нагрузку на программиста и устраняют источник утечек памяти.Однако мы показываем, что неспособность программистов освободить отдельные объекты внутри регионов может привести к значительному увеличению потребления памяти.Хуже того, это ограничение исключает использование регионов для общих идиом программирования, снижая их полезность. Мы представляем обобщение универсальных и основанных на регионах распределителей, которые мы называем reaps.Рипы представляют собой комбинацию областей и куч, обеспечивая полный диапазон семантики областей с добавлением удаления отдельных объектов.Мы показываем, что наша реализация reaps обеспечивает высокую производительность, опережая другие распределители с региональной семантикой.Затем мы используем тематическое исследование, чтобы продемонстрировать космические преимущества и преимущества программных разработок, полученных на практике.Наши результаты показывают, что программисты, которым нужны быстрые регионы, должны использовать reaps, и что большинство программистов, рассматривающих пользовательские распределители, должны вместо этого использовать распределитель Lea.

5 голосов
/ 10 января 2011

Пользовательский распределитель памяти является заменой для malloc (фактически, обычно заменой для operator new), которая извлекает блоки байтов некоторым способом, отличным от значения по умолчанию.malloc - это не самый низкий уровень, который вы можете пройти, потому что malloc сам по себе реализован в терминах еще более простых примитивов из ОС, которые выделяют блоки памяти для разбиения.

Распространенные сценарии использования для создания пользовательских распределителей:Оптимизация для распределения небольших объектов (по умолчанию распределитель обычно очень плохой), распределение таким образом, который гарантирует хорошую локальность (путем размещения объектов рядом друг с другом), распределение с регистрацией / отслеживанием (для диагностики утечек), выделение из мусораСобранный пул ресурсов и т. д. Доступно множество различных опций, и многие программы могут повысить производительность с помощью этих пользовательских распределителей.

2 голосов
/ 08 марта 2013

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

http://www.memorymanagement.org/articles/

http://www.ibm.com/developerworks/aix/tutorials/au-memorymanager/au-memorymanager-pdf.pdf

1 голос
/ 10 января 2011

malloc () - это библиотечная функция в libc (или glibc), которая выполняет системный вызов sbrk (), когда ему нужно фактически выделить больше памяти для процесса.Вместе malloc () и free () управляют списком блоков памяти, которые используются при вызове malloc (), calloc () и т. Д.

Вы можете использовать собственный распределитель при поведении malloc ()нежелательно или вы хотите выполнить дополнительную работу поверх malloc / free.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...