С++: распределители памяти

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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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