Это кажется мне немного расточительным. Разве не имеет смысла выделять узлы в блоках "(small) n", так же как реализации std :: vector перераспределяют при росте
Интересно, я вижу это совершенно по-другому. Я считаю это уместным, и это не тратит впустую никакой памяти По крайней мере, с дефолтными распределителями STL в Windows (MS VS 2008), HP-UX (gcc с STLport) и Linux (gcc без STLport). Важно то, что эти распределители заботятся о фрагментации памяти, и кажется, что они могут справиться с этим вопросом довольно хорошо. Например, ищите Low-fragmentation Heap
в Windows или SBA (Распределитель небольших блоков) в HP-UX. Я имею в виду, что частое выделение и освобождение памяти только для одного узла за раз не должно приводить к фрагментации памяти. Я сам протестировал std::map
в одной из моих программ, и это действительно не вызвало фрагментации памяти с этими распределителями.
Является ли мое утверждение по умолчанию
Схема размещения действительно правильная?
У меня MS VisualStudio 2008 и его std :: map ведет себя точно так же. В HP-UX я использую gcc с и без STLport, и кажется, что их карты STL имеют одинаковый подход к распределению памяти для узлов в std::map
.
есть что-нибудь в стандарте
предотвращение реализации std :: map
от помещения его узлов в блоки
память вместо выделения нового
блок памяти (через его распределитель)
для каждого узла?
Начните с настройки распределителя по умолчанию на вашей платформе, если это возможно. Здесь полезно цитировать Дугласа Леа , который является автором DL-Malloc
... сначала я написал ряд
специальные распределители в C ++,
обычно перегружая оператор new
для разных классов. ...
Однако вскоре я понял, что здание
специальный распределитель для каждого нового класса
это имеет тенденцию быть динамически
выделенный и интенсивно использовался не был
хорошая стратегия при создании видов
поддержка программирования общего назначения
классы, которые я писал в то время.
(С 1986 по 1991 я был
основной автор libg ++, GNU C ++
библиотека.) Более широкое решение было
нужно - написать распределитель, который
был достаточно хорош при нормальных C ++ и C
загружается так, чтобы программистов не было
соблазн написать специально
распределители, кроме как под очень особенным
условия.
Или, как немного более сложная идея, вы даже можете попробовать протестировать свое приложение с Hoard allocator. Я имею в виду просто протестировать ваше приложение и посмотреть, есть ли какая-либо выгода в отношении производительности или фрагментации.