2011-01-09 3 views
15

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

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

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

+1

@muntoo: это не говоря уже о распределители вообще. – jalf

+0

@jalf Я все еще учу, как читать. –

ответ

18

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

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

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

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

+1

+ 1- существует много стратегий распределения, malloc - это только тот, который призван быть как можно более универсальным. – Puppy

5

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

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

1

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

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

+1

'malloc' не вызывает' sbrk() 'в Windows. ;) Это всего лишь деталь реализации в вашей ОС, ничего общего с 'malloc'. – jalf

+0

True :) Платформа смещается ... –

16

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

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

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

2

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

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

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

Смежные вопросы