Разработка 32-битного приложения C ++ / carbon под OS X Snow Leopard столкнулась с проблемой, когда во время перераспределения произошел сбой вектора stl из примерно 20 000 небольших объектов (по 72 байта каждый).Кажется, что вектор, который был размером в несколько мегабайт, не мог расширяться до непрерывного фрагмента памяти, размер которого на момент сбоя составлял всего 1,2 МБ.
GuardMalloc[Appname-33692]: *** mmap(size=2097152) failed (error code=12)
*** error: can't allocate region
GuardMalloc[Appname-35026]: Failed to VM allocate 894752 bytes
GuardMalloc[ Appname-35026]: Explicitly trapping into debugger!!!
#0 0x00a30da8 in GMmalloc_zone_malloc_internal
#1 0x00a31710 in GMmalloc
#2 0x94a54617 in operator new
#3 0x0026f1d3 in __gnu_cxx::new_allocator<DataRecord>::allocate at new_allocator.h:88
#4 0x0026f1f8 in std::_Vector_base<DataRecord, std::allocator<DataRecord> >::_M_allocate at stl_vector.h:117
#5 0x0026f373 in std::vector<DataRecord, std::allocator<DataRecord> >::_M_insert_aux at vector.tcc:275
#6 0x0026f5a6 in std::vector<DataRecord, std::allocator<DataRecord> >::push_back at stl_vector.h:610
Я могу представить несколько стратегий:
1) Reserve () действительно очень большой вектор, как только приложение запускается.Однако это предполагает, что пользователь может не загружать дополнительные файлы, которые вносят вклад в этот вектор, выталкивая его за пределы предварительно выделенного предела и, возможно, возвращаясь к той же ситуации.
2) Изменить вектор объектов / выделения памятив вектор указателей на объекты / выделения памяти.Ясно, что сам вектор становится более управляемым размером, но затем создается 20 000 маленьких объектов (которые в конечном итоге могут стать как 50 000 объектов, в зависимости от того, какие дополнительные файлы загружает пользователь).Создает ли это гигантскую проблему с накладными расходами?
3) Переход от вектора к списку, который может иметь свои собственные проблемы с накладными расходами.
Вектор постоянно повторяется и обычно добавляется толькок.
Есть какие-нибудь мудрые мысли по этим вопросам?
===============
ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ: этот конкретный вектор просто справедливвсе импортированные записи, поэтому они могут быть проиндексированы и отсортированы по ДРУГОМУ вектору, который содержит порядок сортировки.Как только элемент помещается в этот вектор, он остается там на протяжении всего жизненного цикла приложения (также помогает поддерживать операции отмены, следя за тем, чтобы индекс в векторе всегда оставался неизменным для этого конкретного объекта).