У меня есть приложение Visual Studio 2008 C ++, в котором я использую специальный распределитель для стандартных контейнеров, так что их память поступает из файла сопоставления памяти, а не из кучи. Этот распределитель используется для 4 различных случаев использования:
std :: vector > foo;
std :: basic_string , MyAllocator > strn;
Мне нужно выделить около 32 МБ для каждого из них.
Распределитель отслеживает использование памяти, используя std :: map
указателей на размер выделения. typedef std :: map
Каждый SuperBlock представляет 4 МБ памяти.
Существует std :: vector
из них в первом случае В суперблоке недостаточно места.
Алгоритм, используемый для распределителя, выглядит следующим образом:
К сожалению, шаг 2 может стать ОЧЕНЬ медленным через некоторое время. По мере создания копий объектов и уничтожения временных переменных я получаю много фрагментации. Это вызывает глубокий поиск в структуре памяти. Проблема с фрагментацией, так как у меня ограниченный объем памяти для работы (см. Примечание ниже)
Может ли кто-нибудь предложить улучшения этого алгоритма, которые бы ускорили процесс? Нужны ли мне два отдельных алгоритма (1 для выделения фиксированного размера и один для распределителя строк)?
Примечание: Для тех, кому нужна причина: я использую этот алгоритм в Windows Mobile, где есть 32 МБ ограничение слота процесса до кучи. Так что обычный std :: allocator
не справится. Мне нужно разместить выделения в большой области памяти 1 ГБ, чтобы было достаточно места, и это то, что это делает.