предложения по улучшению реализации алгоритма распределителя

У меня есть приложение Visual Studio 2008 C ++, в котором я использую специальный распределитель для стандартных контейнеров, так что их память поступает из файла сопоставления памяти, а не из кучи. Этот распределитель используется для 4 различных случаев использования:

  1. 104-байтовая структура фиксированного размера std :: vector > foo;
  2. 200-байтовая структура фиксированного размера
  3. 304- структура фиксированного размера в байтах
  4. n-байтовые строки std :: basic_string , MyAllocator > strn;

Мне нужно выделить около 32 МБ для каждого из них.

Распределитель отслеживает использование памяти, используя std :: map указателей на размер выделения. typedef std :: map SuperBlock; Каждый SuperBlock представляет 4 МБ памяти.

Существует std :: vector из них в первом случае В суперблоке недостаточно места.

Алгоритм, используемый для распределителя, выглядит следующим образом:

  1. Для каждого суперблока: есть ли место в конце суперблока? поместите выделение туда. (быстро)
  2. Если нет, ищите в каждом суперблоке пустое пространство достаточного размера и помещайте туда выделение. (медленно)
  3. По-прежнему ничего? выделить еще один суперблок и поместить выделение в начало нового суперблока.

К сожалению, шаг 2 может стать ОЧЕНЬ медленным через некоторое время. По мере создания копий объектов и уничтожения временных переменных я получаю много фрагментации. Это вызывает глубокий поиск в структуре памяти. Проблема с фрагментацией, так как у меня ограниченный объем памяти для работы (см. Примечание ниже)

Может ли кто-нибудь предложить улучшения этого алгоритма, которые бы ускорили процесс? Нужны ли мне два отдельных алгоритма (1 для выделения фиксированного размера и один для распределителя строк)?

Примечание: Для тех, кому нужна причина: я использую этот алгоритм в Windows Mobile, где есть 32 МБ ограничение слота процесса до кучи. Так что обычный std :: allocator не справится. Мне нужно разместить выделения в большой области памяти 1 ГБ, чтобы было достаточно места, и это то, что это делает.

6
задан Nate 17 May 2011 в 16:50
поделиться