Есть ли STL Allocator, который не будет неявно освобождать память? - PullRequest
3 голосов
/ 06 октября 2011

Предполагается, что использование памяти в моих контейнерах STL будет нестабильным, то есть будет часто уменьшаться и расти.Я думаю, чтобы объяснить это, указав распределитель для объявлений типа контейнера STL.Я понимаю, что распределители пулов предназначены для обработки ситуаций такого типа, но меня беспокоит то, что волатильность будет больше, чем учитывает пул, и чтобы преодолеть ее, мне пришлось бы провести большое тестирование, чтобы определить хорошие показатели пула.

Мой идеальный распределитель никогда бы неявно освобождал память , и фактически вполне приемлем, если память освобождается только после уничтожения распределителя.Функция-член для явного освобождения неиспользуемой памяти была бы хороша, но не обязательна.Я знаю, что то, что я имею в виду, звучит как распределитель на объект, и это нарушает стандарт.Я бы предпочел придерживаться стандарта, но откажусь от него, если не смогу решить его в этом.

Меня меньше беспокоит начальная производительность и больше средняя производительность.Другими словами, не имеет значения, выделяется ли один элемент или их пул за раз, и более важно, приводит ли указанное выделение к вызову new / malloc.У меня нет проблем с написанием моего собственного распределителя, но кто-нибудь знает о существующем, который выполняет это?Если это имеет значение, это будет для смежных контейнеров памяти (например, vector, deque), хотя было бы неплохо обобщенное решение.

1 Ответ

1 голос
/ 11 октября 2011

Надеюсь, это не слишком просто.

Память будет выделена и освобождена больше для добавления предметов, а не их удаления.

Я считаю, что никогда не "освобождать" память невозможно, если вы не знаете максимальное количество элементов, допустимое вашим приложением. CRT может попытаться выделить больший блок памяти на месте, но как бы вы справились со сбоями?

* * 1008 Explaination

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

  • Во время перераспределения новый больший объем памяти «обновляется» и элементы старого куска памяти копируются в новый один.
  • Важно, чтобы вы не держали никаких итераторов во время push_back элементы, потому что перераспределение сделает недействительной память
    расположение итератора, на которое указывают.

  • В c ++ 11 и TR1, вы можете иметь идеальную пересылку, где только указатель на элементы должен быть скопирован. Это делается с помощью переезда конструктор вместо конструктора копирования.

Однако вы, похоже, хотите избежать перераспределения в максимально возможной степени.

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

  • Емкость - это выделенная память, а размер - количество элементов.

  • Память будет выделяться только при создании и если размер достигнет вместимость. Это должно происходить только с push_back ();

  • Распределитель по умолчанию увеличит емкость в несколько раз (например, 1.5, 2.0), так что перераспределение происходит за линейное время. Так что если у вас есть цикл, который выталкивает данные обратно, он линейный. Или, если вы знаете количество элементов заранее, вы можете выделить один раз.

Существуют концепции пула, которые вы можете изучить. Идея с пулом заключается в том, что вы не уничтожаете элементы, а деактивируете их.

Если вы все еще хотите написать свой собственный распределитель, это хорошая статья.

пользовательские распределители

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...